R:data.frame 中的新名称因子值
R: ne-name factor-values in data.frame
已编辑
我有一个 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: 如上面的代码片段,确实有可能某些列只有三个值中的两个。我用str
检查过。编辑结束)
我想将它们重命名为 "low"、"medium" 和 "high"。可能我之前必须将它们变成 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
函数,但这似乎也不起作用(无论是 integer
还是 factor
值。
integer_disc_labelled <- cut(integers_factor, breaks=c(1,2,3), labels=c("low","medium","high"))
(可能我还需要另一个数据class
!?)
可能有一种简单的方法可以使用我不知道的指定函数重命名值?
非常感谢每一个想法!
第一种方式:
使用 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
的 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 的有用评论编辑了示例 - 谢谢!
括号的巧妙技巧确保原始对象 class 和结构得以保留——我从 Hadley 的 Subassignment 章节中学到了它。
您也可以尝试('df' 来自@PeterDee 的post)
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
另一种相关方法是使用 tidyr
的 gather
函数将所有变量移动到单个列,然后将因子转换应用于收集的列,然后使用 spread
函数把原来的列传回。
已编辑
我有一个 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: 如上面的代码片段,确实有可能某些列只有三个值中的两个。我用str
检查过。编辑结束)
我想将它们重命名为 "low"、"medium" 和 "high"。可能我之前必须将它们变成 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
函数,但这似乎也不起作用(无论是 integer
还是 factor
值。
integer_disc_labelled <- cut(integers_factor, breaks=c(1,2,3), labels=c("low","medium","high"))
(可能我还需要另一个数据class
!?)
可能有一种简单的方法可以使用我不知道的指定函数重命名值?
非常感谢每一个想法!
第一种方式:
使用 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
的 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 的有用评论编辑了示例 - 谢谢! 括号的巧妙技巧确保原始对象 class 和结构得以保留——我从 Hadley 的 Subassignment 章节中学到了它。
您也可以尝试('df' 来自@PeterDee 的post)
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
另一种相关方法是使用 tidyr
的 gather
函数将所有变量移动到单个列,然后将因子转换应用于收集的列,然后使用 spread
函数把原来的列传回。