如果向量长度不同,如何在列表中单独粘贴
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"
我有一个问题,如果它的向量长度不同,如何在列表中使用 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"