微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果向量的长度不同,如何分别粘贴到列表中

如何解决如果向量的长度不同,如何分别粘贴到列表中

我有一个问题,如果向量的长度不同,该如何在列表中使用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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?