使用 R 将列名插入其值

Insert Column Name into its Value using R

我需要在其值中插入列名称、部门。我有这样的代码:

Department <- c("Store1","Store2","Store3","Store4","Store5")
Department2 <- c("IT1","IT2","IT3","IT4","IT5")
x <- c(100,200,300,400,500)
Result <- data.frame(Department,Department2,x)
Result

预期结果如下:

Department <- c("Department_Store1","Departmentz_Store2","Department_Store3","Department_Store4","Department_Store5")
Department2 <- c("Department2_IT1","Department2_IT2","Department2_IT3","Department2_IT4","Department2_IT5")
x <- c(100,200,300,400,500)
Expected.Result <- data.frame(Department,Department2,x)
Expected.Result

有人可以帮忙吗?谢谢

dplyrtidyr 的另一种方式:

library(dplyr)
library(tidyr)

# Convert to character to avoid warning message, will convert all columns to character
Result[] <- lapply(Result, as.character)

Result %>%
  mutate_if(is.factor, as.character) %>% # optional, only convert factor to character, retain all other types
  gather(key, value, -x) %>% 
  mutate(var = paste(key, value, sep = "_")) %>% 
  select(-value) %>% 
  spread(key,var)

    x        Department     Department2
1 100 Department_Store1 Department2_IT1
2 200 Department_Store2 Department2_IT2
3 300 Department_Store3 Department2_IT3
4 400 Department_Store4 Department2_IT4
5 500 Department_Store5 Department2_IT5

数据:

Result <- data.frame(
  Department = c("Store1","Store2","Store3","Store4","Store5"),
  Department2 = c("IT1","IT2","IT3","IT4","IT5"),
  x = c(100,200,300,400,500)
)

如果您将有问题的列名收集到向量中 dep_col,这是一个带有 for 循环的干净 base R 解决方案:

df <- data.frame(x = 1:5,
                 Department = paste0("Store", 1:5),
                 Department2 = paste0("IT", 1:5))

dep_col <- names(df)[-1]

for (c in dep_col)
  df[[c]] <- paste(c, df[[c]], sep = "_")

如果我理解正确,OP 希望在所有以 "Department" 开头的列中的值前面加上相应的列名。

编辑 根据 OP 的要求,select 列的代码已被概括为选择其他列名称。

这是一个使用 data.table 的快速 set() 函数的解决方案:

library(data.table)
setDT(Result)
cols <- stringr::str_subset(names(Result), "^(Department|Division|Team)")
for (j in cols) {
  set(Result, NULL, j, paste(j, Result[[j]], sep = "_"))
}
Result
          Department     Department2   x
1: Department_Store1 Department2_IT1 100
2: Department_Store2 Department2_IT2 200
3: Department_Store3 Department2_IT3 300
4: Department_Store4 Department2_IT4 400
5: Department_Store5 Department2_IT5 500

请注意 set() 通过引用更新,即不复制整个对象。