在R中合并列时的动态列名称

时间:2019-06-21 21:13:53

标签: r

我将for循环内具有匹配后缀的列合并在一起。当我尝试为合并的列添加新的列名时,它将仅使用文字字符。有没有办法使unite使用对象的值?

for (i in length(names(df))){
  first_label = str_split_fixed(names(df)[i-1], "_", n=2)[2]
  second_label = str_split_fixed(names(df)[i], "_", n=2)[2]
  if (second_label == first_label){
    print("TRUE")
    unite_df <- unite(unite_df, first_label, names(df)[i], names(df)[i-1], sep="_" )
  }
}

代码没有任何错误,但是输出只更改了一个列,新名称为“ first_label”,我希望列名为后缀。

例如 当前数据框:

棒球帽,篮球帽,棒球,篮球

10、15、11、14

...

所需数据框:

帽子,球

10_15、11_14

1 个答案:

答案 0 :(得分:1)

使用tidyverse语法的选项是将gather转换成'long'格式,然后将separate列名('key')列转换成两个,spread转换成“宽”格式,并通过summarise将元素放在一起来paste每列

library(tidyverse)
gather(df1) %>% 
  separate(key, into = c("key1", "key2")) %>% 
  spread(key2, value) %>% 
  summarise_at(-1, str_c, collapse="_")
#   ball   hat
#1 11_14 10_15

数据

df1 <- structure(list(Baseball_hat = 10L, Basketball_hat = 15L, Baseball_ball = 11L, 
    Basketball_ball = 14L), class = "data.frame", row.names = c(NA, 
-1L))