如何循环包含R中变量的列名?

时间:2017-07-29 22:38:18

标签: r

我有一个数据帧df:

Shares    Price1    Price2    Price3
100       9         10        11
200       5         6         7
300       3         2         1

我想循环遍历这个数据框并创建三个等于Shares x Price [i]的新列,其中(i in 1:3)。我尝试了以下代码:

for (j in 1:3) {
  df$paste0("MktCap",j,sep="")<-df$Shares*df$paste0("Price",j,sep="")
}

但我收到错误:

Error: attempt to apply non-function

我看了here,但这并不是我想要的,因为我希望我的新列名要迭代。

3 个答案:

答案 0 :(得分:1)

这是你想要的吗?另外,请点击此处的链接http://www.statmethods.net/management/subset.html

for (j in 1:3) {
  df[,paste0("MktCap",j,sep="")]<-df$Shares*df[,paste0("Price",j,sep="")]
}


> df
  Shares Price1 Price2 Price3 MktCap1 MktCap2 MktCap3
1    100      9     10     11     900    1000    1100
2    200      5      6      7    1000    1200    1400
3    300      3      2      1     900     600     300

答案 1 :(得分:1)

@Wen的解决方案有效,如果你有很多价格列,那将是最佳选择。但我认为使用dplyr可以获得更易于阅读和理解的更具表现力的解决方案:

library(dplyr)

df <- data.frame(Shares = c(100, 200, 300), Price1 = c(9, 5, 3), Price2 = c(10, 6, 2), Price3 = c(11, 7, 1))

(df <- df %>%
  mutate(MktCap1 = Shares * Price1,
         MktCap2 = Shares * Price2,
         MktCap3 = Shares * Price3))

  Shares Price1 Price2 Price3 MktCap1 MktCap2 MktCap3
1    100      9     10     11     900    1000    1100
2    200      5      6      7    1000    1200    1400
3    300      3      2      1     900     600     300

答案 2 :(得分:1)

考虑数据框,df:

df = tribble(
~Shares,    ~Price1,    ~Price2,    ~Price3,
100,        9,          10,         11,
200,        5,          6,          7,
300,        3,          2,          1
)

第一种方法 - 太糟糕了。硬编码。这有效,但您需要一个可重复的解决方案。

df$Value1 = df$Shares * df$Price1
df$Value2 = df$Shares * df$Price2
df$Value3 = df$Shares * df$Price3

第二种方法 - 更好,但仍然不是很好。值的子集原始数据框,乘以价格,分配名称,将数据合并在一起

stockPrice = df[,2:4]
stockValue = df$Shares * stockPrice
colnames(stockValue) = c(paste("value", seq(1:3), sep = ""))
cbind(df, stockValue)

第三种(最佳)方法 - 定义一个函数!

calculateValues = function(df){
  N = ncol(df)
  L = N-1
  stockPrice = df[,2:N]
  stockValue = df$Shares * stockPrice
  colnames(stockValue) = c(paste("value", seq(1:L), sep = ""))
  cbind(df, stockValue)
}

calculateValues(df)

这应该每次输出一个带有shares *值的新数据框,命名和一切!唯一的问题是你的df的第一列必须命名为#34; Shares&#34;每一次。