as.character() 应用于 data.frame 的单个元素与 data.frame 的整个'row'



我有一个这样的数据帧:

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" 

最新更新