apply
将您的 data.frame 转换为字符矩阵。使用lapply
:
lapply(a, class)
# $x1
# [1] "numeric"
# $x2
# [1] "factor"
# $x3
# [1] "factor"
在第二个命令中,应用将结果转换为字符矩阵,使用lapply
:
a2 <- lapply(a, as.factor)
lapply(a2, class)
# $x1
# [1] "factor"
# $x2
# [1] "factor"
# $x3
# [1] "factor"
但是对于简单的了望,您可以使用str
:
str(a)
# 'data.frame': 100 obs. of 3 variables:
# $ x1: num -1.79 -1.091 1.307 1.142 -0.972 ...
# $ x2: Factor w/ 2 levels "a","b": 2 1 1 1 2 1 1 1 1 2 ...
# $ x3: Factor w/ 2 levels "a","b": 1 1 1 1 1 1 1 1 1 1 ...
根据评论的补充说明:
为什么 lapply 有效而 apply 无效?
要做的第一件事apply
是将参数转换为矩阵。所以apply(a)
等价于apply(as.matrix(a))
。如您所见str(as.matrix(a))
,为您提供:
chr [1:100, 1:3] " 0.075124364" "-1.608618269" "-1.487629526" ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:3] "x1" "x2" "x3"
没有更多的因素,所以class
返回"character"
所有列。
lapply
适用于列,因此可以为您提供所需的内容(它对class(a$column_name)
每列都执行类似操作)。
您可以在帮助中看到apply
为什么apply
和as.factor
不起作用:
在所有情况下,结果都由 as.vector 在设置维度之前强制转换为基本向量类型之一,因此(例如)因子结果将被强制转换为字符数组。
为什么sapply
和as.factor
不起作用,您可以在帮助中看到sapply
:
Value (...) 与 X (...) 长度相同的原子向量或矩阵或列表 (...) 如果发生简化,则输出类型由层次结构中返回值的最高类型确定 NULL < raw <logical <整数 < 实数 < 复数 < 字符 < 列表 < 表达式,在对列表强制转换为列表之后。
你永远不会得到因子矩阵或data.frame。
如何将输出转换为data.frame
?
简单,as.data.frame
就像你在评论中写的那样使用:
a2 <- as.data.frame(lapply(a, as.factor))
str(a2)
'data.frame': 100 obs. of 3 variables:
$ x1: Factor w/ 100 levels "-2.49629293159922",..: 60 6 7 63 45 93 56 98 40 61 ...
$ x2: Factor w/ 2 levels "a","b": 1 1 2 2 2 2 2 1 2 2 ...
$ x3: Factor w/ 2 levels "a","b": 1 1 1 1 1 1 1 1 1 1 ...
但是如果你想用factor
一个技巧替换选定的字符列:
a3 <- data.frame(x1=letters, x2=LETTERS, x3=LETTERS, stringsAsFactors=FALSE)
str(a3)
'data.frame': 26 obs. of 3 variables:
$ x1: chr "a" "b" "c" "d" ...
$ x2: chr "A" "B" "C" "D" ...
$ x3: chr "A" "B" "C" "D" ...
columns_to_change <- c("x1","x2")
a3[, columns_to_change] <- lapply(a3[, columns_to_change], as.factor)
str(a3)
'data.frame': 26 obs. of 3 variables:
$ x1: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
$ x2: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ...
$ x3: chr "A" "B" "C" "D" ...
您可以使用它来替换所有列:
a3 <- data.frame(x1=letters, x2=LETTERS, x3=LETTERS, stringsAsFactors=FALSE)
a3[, ] <- lapply(a3, as.factor)
str(a3)
'data.frame': 26 obs. of 3 variables:
$ x1: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
$ x2: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ...
$ x3: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ...