【发布时间】:2022-01-14 19:31:24
【问题描述】:
我希望有一种更简单/更快/更清洁的方式来做我想做的事,因为现在这非常复杂:
我的列名是:
"OTS_SM0_1","OTS_SM0_2","OTS_SM0_3","OTS_SM0_4","OTS_SM0_5","OTS_SM0_6",
"OTS_SM0_7","OTS_SM0_8","OTS_SM0_9",
"OTS_SM1_x1_4","OTS_SM1_x1_6","OTS_SM1_x1_7","OTS_SM1_x1_8",
"OTS_SM1_x2_4","OTS_SM1_x2_6","OTS_SM1_x2_7","OTS_SM1_x2_8",
"OTS_SM1_x3_4","OTS_SM1_x3_6","OTS_SM1_x3_7","OTS_SM1_x3_8",
"OTS_SM1_x4_4","OTS_SM1_x4_6","OTS_SM1_x4_7","OTS_SM1_x4_8",
"OTS_SM1_x5_4","OTS_SM1_x5_6","OTS_SM1_x5_7","OTS_SM1_x5_8",
"OTS_SM1_x6_4","OTS_SM1_x6_6","OTS_SM1_x6_7","OTS_SM1_x6_8",
"OTS_SM1_x7_4","OTS_SM1_x7_6","OTS_SM1_x7_7","OTS_SM1_x7_8",
"OTS_SM1_x8_4","OTS_SM1_x8_6","OTS_SM1_x8_7","OTS_SM1_x8_8",
"OTS_SM1_x9_4","OTS_SM1_x9_6","OTS_SM1_x9_7","OTS_SM1_x9_8",
"OTS_SM2_x1","OTS_SM2_x2","OTS_SM2_x3","OTS_SM2_x4","OTS_SM2_x5",
"OTS_SM2_x6","OTS_SM2_x7","OTS_SM2_x8","OTS_SM2_x9"
我需要根据名称将它们的条目连接到一列中。这些是要组合到的所需名称:
OTS_SM0 OTS_SM1_x1 OTS_SM1_x2 OTS_SM1_x3 OTS_SM1_x4 OTS_SM1_x5 OTS_SM1_x6
OTS_SM1_x7 OTS_SM1_x8 OTS_SM1_x9 OTS_SM2_x1 OTS_SM2_x2 OTS_SM2_x3 OTS_SM2_x4
OTS_SM2_x5 OTS_SM2_x6 OTS_SM2_x7 OTS_SM2_x8 OTS_SM2_x9
但问题是这些名称并不总是相同,只有 OTS_SM 部分保持不变,并且要组合的列数以及它们在数据框中的索引会发生变化。
我目前的解决方案是:
columnnames <- c("OTS_SM0_1","OTS_SM0_2","OTS_SM0_3","OTS_SM0_4","OTS_SM0_5","OTS_SM0_6","OTS_SM0_7","OTS_SM0_8","OTS_SM0_9",
"OTS_SM1_x1_4","OTS_SM1_x1_6","OTS_SM1_x1_7","OTS_SM1_x1_8","OTS_SM1_x2_4","OTS_SM1_x2_6","OTS_SM1_x2_7","OTS_SM1_x2_8","OTS_SM1_x3_4",
"OTS_SM1_x3_6","OTS_SM1_x3_7","OTS_SM1_x3_8","OTS_SM1_x4_4","OTS_SM1_x4_6","OTS_SM1_x4_7","OTS_SM1_x4_8","OTS_SM1_x5_4","OTS_SM1_x5_6",
"OTS_SM1_x5_7","OTS_SM1_x5_8","OTS_SM1_x6_4","OTS_SM1_x6_6","OTS_SM1_x6_7","OTS_SM1_x6_8","OTS_SM1_x7_4","OTS_SM1_x7_6","OTS_SM1_x7_7",
"OTS_SM1_x7_8","OTS_SM1_x8_4","OTS_SM1_x8_6","OTS_SM1_x8_7","OTS_SM1_x8_8","OTS_SM1_x9_4","OTS_SM1_x9_6","OTS_SM1_x9_7","OTS_SM1_x9_8",
"OTS_SM2_x1","OTS_SM2_x2","OTS_SM2_x3","OTS_SM2_x4","OTS_SM2_x5","OTS_SM2_x6","OTS_SM2_x7","OTS_SM2_x8","OTS_SM2_x9")
names1_index = grep('^(?!.*x).*OTS_SM', columnnames, perl=TRUE)
names1 = columnnames[names1_index]
names1 = substring(names1, 1, 7)
names2_index = grep("OTS_SM.*_x", columnnames)
names2 = columnnames[names2_index]
names2 = substring(names2, 1, 10)
给出这样的输出:
> names1
"OTS_SM0" "OTS_SM0" "OTS_SM0" "OTS_SM0" "OTS_SM0"
"OTS_SM0" "OTS_SM0" "OTS_SM0" "OTS_SM0"
> names2
"OTS_SM1_x1" "OTS_SM1_x1" "OTS_SM1_x1" "OTS_SM1_x1" "OTS_SM1_x2"
"OTS_SM1_x2" "OTS_SM1_x2" "OTS_SM1_x2" "OTS_SM1_x3" "OTS_SM1_x3"
"OTS_SM1_x3" "OTS_SM1_x3" "OTS_SM1_x4" "OTS_SM1_x4" "OTS_SM1_x4"
"OTS_SM1_x4" "OTS_SM1_x5" "OTS_SM1_x5" "OTS_SM1_x5" "OTS_SM1_x5"
"OTS_SM1_x6" "OTS_SM1_x6" "OTS_SM1_x6" "OTS_SM1_x6" "OTS_SM1_x7"
"OTS_SM1_x7" "OTS_SM1_x7" "OTS_SM1_x7" "OTS_SM1_x8" "OTS_SM1_x8"
"OTS_SM1_x8" "OTS_SM1_x8" "OTS_SM1_x9" "OTS_SM1_x9" "OTS_SM1_x9"
"OTS_SM1_x9" "OTS_SM2_x1" "OTS_SM2_x2" "OTS_SM2_x3" "OTS_SM2_x4"
"OTS_SM2_x5" "OTS_SM2_x6" "OTS_SM2_x7" "OTS_SM2_x8" "OTS_SM2_x9"
例如对于数据帧 DF 中的 name1 变量:
OTS_SM0_1 OTS_SM0_2 OTS_SM0_3 OTS_SM0_4 OTS_SM0_5 OTS_SM0_6 OTS_SM0_7 OTS_SM0_8 OTS_SM0_9
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 0 0 0 0 0 0 0 0 None of the above
2 Facebook 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 None of the above
4 Facebook Instagram Twitter Snapchat Pinterest 0 Tik Tok 0 0
5 0 0 0 0 0 LinkedIn 0 0 0
6 Facebook 0 0 0 Pinterest 0 0 0 0
7 Facebook Instagram 0 0 0 0 0 0 0
8 Facebook Instagram 0 0 Pinterest 0 Tik Tok 0 0
9 NA NA NA NA NA NA NA NA NA
10 NA NA NA NA NA NA NA NA NA
然后我会合并同名列索引:
unique_names1 <- unique(names1)
for (i in 1:length(unique_names1)){
combine1= DF[,grep(unique_names1[i],colnames(DF))]
NewCol1 <- do.call(paste, c(combine1[], sep = ";"))
NewCol1 <- str_remove_all(NewCol1,";NA")
NewCol1 <- str_remove_all(NewCol1,"NA;")
NewCol1 <- str_remove_all(NewCol1,";0")
NewCol1 <- str_remove_all(NewCol1,"0;")
DF <- cbind(DF,NewCol1)
}
NewCol1
[1] "None of the above" "Facebook"
[3] "None of the above" "Facebook;Instagram;Twitter;Snapchat;Pinterest;Tik Tok"
[5] "LinkedIn" "Facebook;Pinterest"
[7] "Facebook;Instagram" "Facebook;Instagram;Pinterest;Tik Tok"
[9] "NA" "NA"
然后使用一些更有趣的索引显然将其重命名为“OTS_SM0”。以及删除原始列。
【问题讨论】:
-
如果您与
dput共享数据或将您的数据包装在head中,然后在dput中使用,则更容易帮助您。一般来说,我认为您可以使用dplyr::pivot_long->dplyr::separate->dplyr::pivot_wider轻松解决这个问题
标签: r concatenation