【问题标题】:Merge rows in one data.frame合并一个data.frame中的行
【发布时间】:2016-01-22 00:08:09
【问题描述】:

这是一个与merge-two-rows-in-one-dataframe 非常相似的问题,但我有字符串变量,只想折叠一些具有相同国家名称的行。我调整了 MWE

data<-data.frame(code= c(345, 346), name= "Yemen", v1= c("", "text1"), v2= c("text2", ""),v3= c("text3", ""),v4= c("", "text4"))
code  name    v1    v2    v3    v4
345   Yemen         text2 text3      
346   Yemen   text1             text4

aggregate(x=data[c("v1","v2","v3","v4")], by=list(name=data$name), paste)
name v1.1  v1.2  v2.1 v2.2  v3.1 v3.2 v4.1  v4.2
1 Yemen      text1 text2      text3           text4

我希望 paste 可以作为一个函数来将空单元格与另一行的文本结合起来,但是我以某种方式得到了一个带有更多变量的行 v1.1 等等。

【问题讨论】:

  • 一行数据框是您调用聚合的预期结果。您能否更清楚地了解您在这里寻找什么结果?

标签: r merge rows


【解决方案1】:

我们可以使用data.table。我们将 'data.frame' 转换为 'data.table' (setDT(data)),按 'name' 分组,我们将unlist 中指定的列.SDcolspaste 放在一起。

library(data.table)
setDT(data)[, unlist(.SD), name, .SDcols=v1:v4][V1!='', paste(V1, collapse=', '), name]

由于没有显示预期的输出,它也可能是

setDT(data)[, lapply(.SD, function(x) paste(x[x!=''], collapse='')) , name, .SDcols= v1:v4]

更新

根据预期的输出,我们将'factor'列('v1:v4')转换为'character'类,然后使用aggregatepaste的公式方法将按'name'分组的列。

data[3:6] <- lapply(data[3:6], as.character)
aggregate(.~name, data[-1], FUN=function(x) paste(x[x!=''], collapse=', '))

【讨论】:

  • 谢谢第二个想法有效,看看它是否可以与聚合命令一起使用会很有趣,我不太明白我现在在做什么:)
  • @MaxM 所以你希望在每一列中组合,而不是整行。
  • 不,它的方式很好。由于某些原因,我的数据是这样的结构,即我有一个国家的几行,但在 v1-v4 列之一中只有一个条目。上面的代码以一种我最多为每个国家/地区拥有一行的方式折叠我的数据。是的,第二个命令有效
猜你喜欢
  • 2014-08-12
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 2013-01-24
  • 2011-01-13
  • 2018-11-21
  • 2021-01-08
相关资源
最近更新 更多