如何解决如果向量的长度不同,如何分别粘贴到列表中
我有一个问题,如果向量的长度不同,该如何在列表中使用paste
函数。我有一个具有不同长度列的数据框,例如:
df = data.frame(Set1=c("abc",'def',"ghi","jkl",""),Set2=c("abc","",Set3=c("mno","pqr","stu","vwx","xyz"))
我尝试根据每一列创建一个列表a.list
,并用,
折叠每个因子。像
a.list
$Set1
[1] abc,def,ghi,jkl
$Set2
[1] abc,def
$Set3
[1] mno,pqr,stu,vwx,xyz
我尝试过
> a.list = apply(df,2,as.list)
> a.list = lapply(a.list,function(x) paste(x,collapse=",")
但是,它使,
的因子折叠到列表的最大长度。例如,
a.list
$Set1
[1] "abc,jkl,"
$Set2
[1] "abc,"
抱歉,这可能是一个简单的问题。我仍在学习R。谢谢!
解决方法
在用''
遍历列之后,再用setdiff
遍历其余元素(lapply
),我们可以用paste
除去toString
。请注意,toString
=> paste(...,collapse=",")
lapply(df,function(x) toString(setdiff(x,'')))
这假定列中有unique
个元素。如果有重复项,请使用vsetdiff
library(vecsets)
lapply(df,function(x) toString(vsetdiff(x,'')))
或使用nzchar
lapply(df,function(x) toString(x[nzchar(x)]))
#$Set1
#[1] "abc,def,ghi,jkl"
#$Set2
#[1] "abc,def"
#$Set3
#[1] "mno,pqr,stu,vwx,xyz"
另外,最好返回vector
而不是list
,因为list
的每个元素都为length
1
sapply(df,function(x) toString(x[nzchar(x)]))
或使用tidyverse
library(dplyr)
library(stringr)
df %>%
summarise(across(everything(),~ str_c(.[nzchar(.)],")))
注意:我们不需要用!=
创建逻辑矢量,因为nzchar
已经做到了
您可以从列表中的每个元素中删除空值,然后paste
删除值。
lapply(df,function(x) paste(x[x!=''],collapse = ","))
#$Set1
#[1] "abc,xyz"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。