如何修改<list>数据框列? 我在rstudio工作,试图清理我从JSON文件转换的Pokémon数据集,并且我的数据框架名为BP1: 物种项目能力 ...

问题描述 投票:0回答:1
如果我跑了

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

,则可以做:
rstudio data-cleaning
1个回答
0
投票
library(tidyr) library(dplyr) bp1_clean <- bp1 %>% unnest_wider(item, names_sep = "")

这将将ITEM列转换为名为Item1Item2等的新列,而行只有一个元素在额外的列中获得na

。 (
names_sep
参数控制新列名称的形成方式。)

,如果您只想将列表元素组合到同一列中的一个字符串中(被逗号分隔),则可以使用SapplyPaste bp1$item <- sapply(bp1$item, function(x) paste(x, collapse = ", ")) 但要获得单独的列,

Unnest_wider()是推荐的方法。

这种方法可以概括为每行的任何数量的项目,而无需手动调整代码,因此非常适合清理数据集。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.