【问题标题】:Converting each list within a dataframe to a normal column将数据框中的每个列表转换为普通列
【发布时间】:2017-05-07 08:37:41
【问题描述】:

我从网络上的多个来源生成一个数据框,这些来源事先经过清理,然后使用

cleans <- ls() 
cleans <- cleans[grepl("Clean_News", cleans)]

我第一次尝试将它们绑定在一起的灵感来自 Stack Overflow 上的一个解决方案:

All_News <- mapply(get, grep("Clean_News", ls(), value=T))
All_News <- data.frame(t(All_News))
All_News <- as.data.frame(All_News)

但是,这对我来说是个问题,因为结果是一个数据框,其中每一列都是整数或字符的列表。 所以,我的主要问题是如何将数据框中的每个列表转换为 df.xml 中的普通列。我在 Stack Overflow 上尝试了许多手工制作的功能,但没有一个对我有用(由于我的经验不足,我猜......)。 df 的形式为

All_News <- data.frame(a=I(list(1,1:2,1:3)), b=I(list(4:6,7:9,10:11)))

或者,我尝试了以下方法,效果很好:

All_News <- do.call(rbind, lapply(cleans, get))

但是有一个巨大的缺点是我没有成功地将数据框的名称作为行名/或第一列放入数据框... 所以,我的第二个问题是如何将单个数据帧的名称附加到巨大 df 的每一行,而不是像下面的代码行那样的 id。

t2 <- rbindlist(lapply(cleans, get), idcol = "id") 

这不太好,因为我需要将所有数据帧的名称重复 x 次作为标识符,例如而且由于这是一个包含数千个网页的自动化过程,因此我事先不知道每个数据帧中的行数。数据如下:

 news1 data1 data2
 news1 data5 data6
 news2 data3 data4
 and so on.

我尝试了一些类似的方法

nr <- length(cleans)
names <- rep(cleans, nr)
names <- sort(names)

但没有多大成功。

【问题讨论】:

  • 您能否显示玩具示例的预期输出All_News 也许lst &lt;- lapply(All_News, unlist);data.frame(lapply(lst, 'length&lt;-', max(lengths(lst))))
  • 哇!不仅适用于玩具示例,也适用于我的真实数据。非常感谢,阿克伦!你能解释一下第二个命令的确切作用吗?
  • lapply 遍历列表的每个元素并将函数应用于该元素。在这种情况下,元素的最大长度。但我建议你阅读 *apply-functions (?lapply),因为你会学到很多东西!

标签: r dataframe data-conversion


【解决方案1】:

我们可以通过循环遍历数据集的列来做到这一点,unlistlist

lst <- lapply(All_News, unlist)

然后,根据最大长度 (max(lengths(lst))) 在末尾填充 NA 以使 list 元素的长度相同,并将其转换为 data.frame

data.frame(lapply(lst, `length<-`, max(lengths(lst))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2014-10-18
    • 2021-08-08
    • 1970-01-01
    • 2020-04-17
    相关资源
    最近更新 更多