R:data.frame 中的 ne-name 因子值

Posted

技术标签:

【中文标题】R:data.frame 中的 ne-name 因子值【英文标题】:R: ne-name factor-values in data.frame 【发布时间】:2015-05-14 10:54:07 【问题描述】:

已编辑

我有一个 data.frame [integer_disc],它由 integer 变量(值为 1、2、3)组成。数据框有大约 120 列和 54,000 行。下面是截图

Col1   Col2   Col3  Col 4 [up to Col 120]
1      2      1     1 
3      1      2     1
2      2      2     2
1      3      3     1

(EDIT:和上面的sn-p一样,确实有可能有些列只有三个值中的两个。我用str检查过。edit end)

我想将它们重命名为“低”、“中”和“高”。可能我之前必须将它们变成factor 值?我会通过

integers_factor <- lapply(integer_disc, function(x) as.factor(x))

然后我在这里阅读了如何重命名 (change name of specific levels in factor),但不同之处在于我需要重命名所有列,输出如下:

Col1     Col2       Col3       Col 4 [up to Col 120]
low      medium      low       low
high     low         medium    low
medium   medium      medium    medium        
low      high        high      low

我也尝试了 cut 函数,但这似乎也不起作用(integerfactor 值都没有。

integer_disc_labelled <- cut(integers_factor, breaks=c(1,2,3), labels=c("low","medium","high"))

(可能我还需要另一个数据class这里!?)

可能有一种简单的方法可以使用我不知道的指定函数重命名值?

非常感谢您的每一个想法!

【问题讨论】:

是每列都有因子的所有级别还是有些列只能有两个或一个级别? 啊,抱歉再次不准确。我编辑了我的问题,因为有些只有 2 个级别似乎很重要...... 【参考方案1】:

第一种方式: 使用ifelse 语句:

df <- read.table(text = "Col1   Col2   Col3  
1      2      1
3      1      2
2      2      2
1      3      3", header = TRUE, stringsAsFactors = FALSE)

df[] <- lapply(df, function(col) ifelse(col == 1, "low", 
                                 ifelse(col == 2, "med", "high")))

> df
  Col1 Col2 Col3
1  low  med  low
2 high  low  med
3  med  med  med
4  low  high high

第二种方式: 使用factorlabels 参数: (为演示更改了 Col2 的最后一个值,其中一列不包含所有值):

df <- read.table(text = "Col1   Col2   Col3  
1      2      1
3      1      2
2      2      2
1      2      3", 
header = TRUE, stringsAsFactors = FALSE)

> df[] <- lapply(df, factor, 
                 levels = c(1, 2, 3), 
                 labels = c("low", "med", "high"))
> df
  Col1 Col2 Col3
1  low  med  low
2 high  low  med
3  med  med  med
4  low  med high

> str(df)
'data.frame':   4 obs. of  3 variables:
 $ Col1: Factor w/ 3 levels "low","med","high": 1 3 2 1
 $ Col2: Factor w/ 3 levels "low","med","high": 2 1 2 2
 $ Col3: Factor w/ 3 levels "low","med","high": 1 2 2 3

我根据 @agenis 和 @Roland 的有用 cmets 编辑了我的示例 - 谢谢! 括号的巧妙技巧确保保留了原始对象类和结构 - 我从 Hadley 的 Subassignment 章节中学到了这一点。

【讨论】:

这仅在每列具有所有级别的因子时才有效。如果缺少一个,它会给出一个错误。 如果您使用labels 参数,您也应该始终使用levels 参数。 那么首先将data.frame 分成两个只有2个或只有3个值的单独的值是否有效? jap,@PeterDee,您的编辑成功了!感谢您的帮助! 很好,@PeterDee。我不知道“括号技巧”。它是如何工作的?【参考方案2】:

您也可以尝试(@PeterDee 帖子中的“df”)

df[] <- c('low', 'med', 'high')[as.matrix(df)]
df
#  Col1 Col2 Col3
#1  low  med  low
#2 high  low  med
#3  med  med  med
#4  low high high

【讨论】:

【参考方案3】:

另一种相关方法是使用tidyrgather 函数将所有变量移动到单个列,然后将因子转换应用于收集的列,然后使用spread 函数传播回来到原始列。

【讨论】:

以上是关于R:data.frame 中的 ne-name 因子值的主要内容,如果未能解决你的问题,请参考以下文章

R:`[.data.frame`(frame, predictors) 中的决策树错误:选择了未定义的列

从 R 中的 data.frame 中删除一整列

在 R 中:is.data.frame(data) 中的错误:找不到对象'',C5.0 绘图

使用向量来索引 R 中的 data.frame

如何将简单的 data.frame 附加到 R 中的 SpatialPolygonDataFrame?

R:合并同一data.frame中的行[重复]