我有一个这样的数据帧:
df<-data.frame(x=c(1,2,3),y=c('b','a','c'))
如果我输入命令:
as.character(df$y[1])
或as.character(df[1,2])
我最终得到了输出"b"
如果我输入命令:
as.character(df[1,])
我最终得到了输出"1" "2"
我知道,对于上面列出的最终命令,R给了我字符"b"的因子级别
但是,为什么前两个命令不这样做呢?
当我输入as.character()
时,R实际上在"内部"做什么?不管是什么,我想这就是输出不同的原因。
提前感谢
我会一步一步地指导你我的印象是R:内部发生了什么
data.frame实际上是列表:
typeof(df)
# list
# drops the data.frame class essentially
?`[`
class(df[1, , drop = TRUE])
class(df[1, , drop = FALSE])
由于data.frame实际上是列表,因此数据帧的一行是一个包含与data.frame:中的列一样多的元素的列表
df[1, , drop = TRUE]
取消列表
当你试图将列表强制为向量时,如果不是所有元素都是同一类型的,那么unlist()
it.´unlist((`本身会按一定的层次来强制元素。正如unlist的帮助页面中的值部分所说:
输出类型由层次结构中组件的最高类型NULL<原始<逻辑<integer<双<复数<字符<列表<表达式,在将配对列表强制为列表之后
我的类型是什么
在这种情况下,它必须将double和整数值强制为最高类型,即double。这是因为因子实际上是以整数形式存储的。检查下面的代码在哪种情况下会发生什么以及我们处理的类型:
df <- data.frame(x = c(1, 2, 3),
y = c('b','a','c'))
class(df$x)
typeof(df$x)
class(df$y)
typeof(df$y)
unlist(df[1, , drop = TRUE])
typeof(unlist(df[1, , drop = TRUE]))
df <- data.frame(x = 1:3, # this returns integers
y = c('b','a','c'))
class(df$x)
typeof(df$x)
class(df$y)
typeof(df$y)
unlist(df[1, , drop = TRUE])
typeof(unlist(df[1, , drop = TRUE]))
如您所见,R强制一个向量中的所有元素,然后将其转换为字符。
我不确定as.character((的内部结构。但也许这可以解决问题:df<-data.frame(x=c(1,2,3), y=c('b','a','c'), stringsAsFactors = FALSE)
则as.character(df[1,])
将返回[1] "1" "b"
。它是[1] "1" "b"
而不是"b"
,因为df[1,]返回整行。
希望这能有所帮助。致以最诚挚的问候
也许你可以试试
> c(as.matrix(df[1,]))
[1] "1" "b"
或
> mapply(as.character,df[1,])
x y
"1" "b"