我有一个data.frame:df<-data.frame(x=c(1,2,3),y=c('b','a','c'))
如果输入:as.character(df[1,])
我得到:"1" "2"
或者,如果我输入:paste(df[1,],collapse=':')
我得到:1:2
但是,如果我输入:apply(df,1,as.character)
或apply(df,1,paste,collapse=':')
我得到:
[1,] "1" "2" "3"
[2,] "b" "a" "c"
和
"1:b" "2:a" "3:c"
我假设运行apply函数会将df的每一行强制为一个 vector ,然后将其应用于例如as.character()或paste()
但是,事实并非如此。有人可以解释在这种情况下应用程序发生了什么,以及为什么它对以下情况给出了不同的答案:
paste(df[1,],collapse=":")
然后paste(df[2,],collapse=":")
然后paste(df[3,],collapse=":")
最佳答案
问题在于字符串列是factor
类,因为在构造data.frame
时,默认选项是stringsAsFactors = TRUE
,当我们跨列执行factor
时,paste
将被强制为整数存储模式。为了避免这种行为,请使用
df <- data.frame(x=c(1,2,3),y=c('b','a','c'), stringsAsFactors = FALSE)
paste(df[1,],collapse=":")
#[1] "1:b"
使用
apply
,它将转换为matrix
,并且矩阵只能具有一个类,因此,当基于类的优先级存在字符元素时,它将数字转换为“字符”关于r - 在R中的data.frame的行上使用apply函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60792233/