R:data.frame中的ne名称因子值
已编辑 我有一个R:data.frame中的ne名称因子值,r,class,integer,dataframe,rename,R,Class,Integer,Dataframe,Rename,已编辑 我有一个data.frame[integer\u disc],它由integer变量(值为1,2,3)组成。数据帧大约有120列和54000行。下面是一张剪短的照片 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:在上面的代码片段中,确实有可能某些列只有三个值中的
data.frame
[integer\u disc],它由integer
变量(值为1,2,3)组成。数据帧大约有120列和54000行。下面是一张剪短的照片
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:在上面的代码片段中,确实有可能某些列只有三个值中的两个。我用str
EDIT end检查了它)
我想把它们重新命名为“低”、“中”和“高”。可能我以前必须将它们转换为因子值?我会通过
integers_factor <- lapply(integer_disc, function(x) as.factor(x))
我还尝试了cut
功能,但这似乎也不起作用(无论是integer
还是factor
值)
integer_disc_labelled <- cut(integers_factor, breaks=c(1,2,3), labels=c("low","medium","high"))
integer\u disc\u标签第一种方式:
使用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
我根据@agenis和@Roland的有用评论编辑了我的示例-谢谢!
括号的巧妙技巧确保了原始的对象类和结构得以保留——我从哈德利的章节中学到了这一点。你也可以试试('df'来自@PeterDee的帖子)
df[]另一种相关方法是使用tidyr
的collect
函数将所有变量移动到单个列,然后将因子转换应用到收集的列,然后使用spread
函数将其扩散回原始列。只有在每列都有所有级别的因子时,此方法才有效。I如果缺少一个,它将给出一个错误。如果您使用labels
参数,那么您也应该始终使用levels
参数。因此,首先将数据.frame
分隔为两个单独的,只有2个或3个值的值。jap,@PeterDe,您的编辑成功了!谢谢您的帮助!很好,@PeterDee、 我不知道“括号技巧”。它是如何工作的?每个列都有因子的所有级别,还是有些列只能有两个或一个级别?啊,很抱歉再次不精确。我编辑了我的问题,因为有些列只有两个级别似乎很重要。。。
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
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
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