R:data.frame中的新名称因子值

时间:2015-03-12 10:22:16

标签: r class integer dataframe rename

EDITED

我有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

编辑:与上面的代码段一样,某些列确实可能只包含三个值中的两个。我使用str进行了检查。编辑结束< /强>)

我想将这些重新命名为&#34; low&#34;,&#34; medium&#34;和&#34; high&#34;。可能我以前必须把它们变成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!)

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

非常感谢每个想法!

3 个答案:

答案 0 :(得分:3)

第一种方式: 使用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

第二方式: 使用factor&#39; labels参数: (更改了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的有用评论编辑了我的例子 - 谢谢! 括号中的巧妙技巧确保原始对象类和结构得以保留 - 我是从Hadley的Subassignment章节中学到的。

答案 1 :(得分:3)

您也可以尝试(&#39; df&#39;来自@ PeterDee&#39;)

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

答案 2 :(得分:0)

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