合并行 data.frame
Merge rows in one data.frame
这是一个与 merge-two-rows-in-one-dataframe 非常相似的问题,但我有字符串变量,只想折叠一些具有相同国家/地区名称的行。我修改了 MWER
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 等的一行。
我们可以使用 data.table
。我们将 'data.frame' 转换为 'data.table' (setDT(data)
),按 'name' 分组,我们 unlist
在 .SDcols
中指定的列,并且 paste
一起吧。
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'class,然后使用aggregate
的公式方法paste
按 'name'.
分组的列
data[3:6] <- lapply(data[3:6], as.character)
aggregate(.~name, data[-1], FUN=function(x) paste(x[x!=''], collapse=', '))
这是一个与 merge-two-rows-in-one-dataframe 非常相似的问题,但我有字符串变量,只想折叠一些具有相同国家/地区名称的行。我修改了 MWER
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 等的一行。
我们可以使用 data.table
。我们将 'data.frame' 转换为 'data.table' (setDT(data)
),按 'name' 分组,我们 unlist
在 .SDcols
中指定的列,并且 paste
一起吧。
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'class,然后使用aggregate
的公式方法paste
按 'name'.
data[3:6] <- lapply(data[3:6], as.character)
aggregate(.~name, data[-1], FUN=function(x) paste(x[x!=''], collapse=', '))