如何将r数据帧的多个列合并为一个列表列

如何将r数据帧的多个列合并为一个列表列,r,list,dataframe,nested-lists,R,List,Dataframe,Nested Lists,我想将数据框中的多个列合并为该数据框中的一列,即列表。例如,我有以下数据框成分: name1 name2 imgID attr1 attr2 attr3... Item1 ItemID1 Img1 water chocolate soy... Item2 ItemID2 Img2 cocoa spice milk... 我希望将attr列合并为一列,该列是这些项目的逗号分隔列表,如果可能,请以以下格式显示: name1 name2 imgID attrs Item1 ItemID1 Img1

我想将数据框中的多个列合并为该数据框中的一列,即列表。例如,我有以下数据框成分:

name1 name2 imgID attr1 attr2 attr3...
Item1 ItemID1 Img1 water chocolate soy...
Item2 ItemID2 Img2 cocoa spice milk...
我希望将attr列合并为一列,该列是这些项目的逗号分隔列表,如果可能,请以以下格式显示:

name1 name2 imgID attrs
Item1 ItemID1 Img1 c("water", "chocolate", "soy", ...)
Item2 ItemID2 Img2 c("cocoa", "spice", "milk", ...)

是否有一种简洁的方法可以使用粘贴或连接来编写代码,允许我将数据帧的列称为
成分[4:50]
,而不是按名称来调用?还有一种方法可以不在该列表中包含
NA
NULL
值吗?

您可以使用
tidyr::nest
,不过您可能希望以后将嵌套的数据帧简化为字符向量,例如

库(tidyverse)
项目%
变异(attr=map(attr,simplify))
嵌套项
#>#A tibble:2 x 4
#>名称1名称2 imgID属性
#>           
#>1项1项ID1 Img1
#>2项目2项目ID2 Img2
其他选项包括使用
tidyr::gather
将其重塑为long,按除新列以外的所有列进行分组,并以更注重dplyr的样式将值列聚合到列表中:

项目%>%
聚集(attr_num,attr,contains('attr'))%>%
分组依据(变量(-attr\u num,-attr))%>%
摘要(属性=列表(属性))%>%
解组()
或者
attr*
列合并起来,然后使用
strsplit
以更加注重字符串的方式在列表列中分隔它们:

项目%>%
联合(属性,包含('attr'))%>%
突变(attr=strsplit(attr,'.'))
或者使用
purrr::transpose
和tidyselect以列表为中心的方式:

项目%>%
突变(attr=transpose(select(,contains('attr')))%>%
选择(-matches('attr'))

所有选项都返回相同的内容,至少在示例数据上是这样。进一步的清理,例如删除
NA
s,可以通过使用
lappy
/
purrr::map

对新列进行迭代来完成。当您的某些行为空或它们没有全部填充值时,这是否有效?例如,我的某些项目的属性数不相同。当我尝试第一种方法时,我得到了以下消息:“mutate_impl(.data,dots)中的错误:求值错误:参数的长度为零。另外:警告消息:1:在min(x,na.rm=na.rm)中:min没有未丢失的参数;返回Inf'您可以使用
mutate(attr=map(attr,NA.ommit))
或类似方法删除
NA
s,但是在给出警告的情况下,您仍然需要考虑在汇总列表元素时列表元素中没有任何内容的可能性,例如通过使用
map
中的控制流,例如
map(attr,~if(长度(.x)=0其他…