如果向量长度不同,如何在列表中单独粘贴

How to paste individually in a list if the vectors are different in lengths

我有一个问题,如果它的向量长度不同,如何在列表中使用 paste 函数。我有一个包含不同长度列的数据框,例如:

df = data.frame(Set1=c("abc",'def',"ghi","jkl",""), Set2=c("abc",'def',"","",""), 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,def,ghi,jkl,"

$Set2
[1] "abc,def,,,"

抱歉,这可能是一个简单的问题。我还在学习 R。谢谢!

我们可以在使用 lapply 遍历列后,使用 setdiff 删除 '',然后 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"

此外,return a 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(.)], collapse=",")))

注意:我们不需要使用 != 创建逻辑向量,因为 nzchar 已经这样做了

您可以删除列表中每个元素的空值和 paste 这些值。

lapply(df, function(x) paste(x[x!=''], collapse = ","))

#$Set1
#[1] "abc,def,ghi,jkl"

#$Set2
#[1] "abc,def"

#$Set3
#[1] "mno,pqr,stu,vwx,xyz"