使用粘贴功能从现有列名创建新列名

时间:2018-12-21 10:25:35

标签: r

假设我有一个数据帧df,其中包含变量ABC。我想再创建3个对应的列,分别使用名称A_rankedB_rankedC_ranked。出于这个问题,我将如何填充它们并不重要,因此让我们假设我将它们全部设置为5。我尝试了以下代码:

for (i in 1:length(df)){
  df%>%mutate(
    paste(colnames(df)[i],"ranked", sep="_")) = 5
}

我也尝试过:

for (i in 1:length(df)){
  df%>%mutate(
    as.vector(paste(colnames(df)[i],"ranked", sep="_")) = 5
}

并且:

for (i in 1:length(df)){
  df$paste(colnames(df)[i],"ranked", sep="_")) = 5
}

他们似乎都没有人工作。有人可以告诉我这样做的正确方法是什么吗?

3 个答案:

答案 0 :(得分:2)

这是一个使用虹膜数据集的data.table选项(这里,我们根据现有列的colnames创建了4个列)。

# data
df <- iris[, 1:4]
str(df)

# new columns
library(data.table)
setDT(df)[, paste(colnames(df), "ranked", "_") := 5][] 

# output
   Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length ranked _
  1:          5.1         3.5          1.4         0.2                     5
  2:          4.9         3.0          1.4         0.2                     5
  3:          4.7         3.2          1.3         0.2                     5
  4:          4.6         3.1          1.5         0.2                     5
  5:          5.0         3.6          1.4         0.2                     5
 ---                                                                        
146:          6.7         3.0          5.2         2.3                     5
147:          6.3         2.5          5.0         1.9                     5
148:          6.5         3.0          5.2         2.0                     5
149:          6.2         3.4          5.4         2.3                     5
150:          5.9         3.0          5.1         1.8                     5
     Sepal.Width ranked _ Petal.Length ranked _ Petal.Width ranked _
  1:                    5                     5                    5
  2:                    5                     5                    5
  3:                    5                     5                    5
  4:                    5                     5                    5
  5:                    5                     5                    5
 ---                                                                
146:                    5                     5                    5
147:                    5                     5                    5
148:                    5                     5                    5
149:                    5                     5                    5
150:                    5                     5                    5 

# If you want to fill new columns with different values you can try something like
setDT(df)[, paste(colnames(df), "ranked", "_") := list(Sepal.Length/2,
                                                       Sepal.Width/2,
                                                       Petal.Length/2,
                                                       Petal.Width/2)][]

答案 1 :(得分:2)

这应该有效:

df[paste(names(df), "ranked", sep = "_")] <- 5

df

#   A B C A_ranked B_ranked C_ranked
# 1 1 2 3        5        5        5

数据:

df <- data.frame(A = 1, B = 2, C = 3)

答案 2 :(得分:0)

有帮助吗?

dat <- data.frame(A=5,B=5,C=5)

dat %>%
  mutate_each(funs(ranked=sum)) %>% 
  head()