我将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
答案 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))