bp1$item
我将其作为控制台输出:
[[1]]
[1] "Weakness Policy" "Ghostium Z"
[[2]]
[1] "Life Orb"
[[3]]
[1] "Ghostium Z"
[[4]]
[1] "Focus Sash"
[[5]]
[1] "Leftovers"
我想要的是修改BP1,以便我得到这样的东西:
species item1 item2 ability
<chr> <char> <char> <chr>
1 Aegislash Weakness Policy Ghostium Z Stance Change
2 Aegislash Life Orb NA Stance Change
3 Aegislash Ghostium Z NA Stance Change
4 Aegislash Focus Sash NA Stance Change
5 Aegislash Leftovers NA Stance Change
尽管这里的行数足够小,以至于我可以手工制作新的数据框,但BP1基本上只是我数据的一个子集,因此我需要一个可以推广的解决方案。我猜项目列的数量可能是原始项目列中最长字符列表的长度,如果这很有意义。到目前为止,我一直在尝试将项目列中的每个字符列表变成字符串,以便将项目列变成列。因此,在第一行中,弱点政策和幽灵Z将合并为1个字符串,也许是逗号或类似的分隔符:
item
<char>
Weakness Policy, Ghostium Z
Life Orb
Ghostium Z
Focus Sash
Leftovers
我认为,如果我得到它,我可能会有一些代码,可以按照我希望将其拆分的方式将列分开。
我尝试了一些涉及lapply()和粘贴()的东西:
bp1$item<-lapply(bp1it, function(y) paste(y))
bp1%>%
mutate(item=as.character(item))%>%
mutate(item=paste(item, collapse = ';'))
bp1$item<-lapply(bp1$item, as.character)
但我尚未设法获得项目列没有任何列表元素。
您可以“扩展”列表列,以便列表的每个元素都有自己的列。一种直接的解决方案是使用
Tidyr
软件包的unnest_wider()
函数。例如,如果您的数据帧称为BP1,并且列表列为
ITEM
,则可以做:library(tidyr)
library(dplyr)
bp1_clean <- bp1 %>%
unnest_wider(item, names_sep = "")
这将将ITEM列转换为名为Item1,Item2等的新列,而行只有一个元素在额外的列中获得na
。 (names_sep参数控制新列名称的形成方式。)
,如果您只想将列表元素组合到同一列中的一个字符串中(被逗号分隔),则可以使用Sapply和Paste::
bp1$item <- sapply(bp1$item, function(x) paste(x, collapse = ", "))
但要获得单独的列,
这种方法可以概括为每行的任何数量的项目,而无需手动调整代码,因此非常适合清理数据集。