我有一个数据帧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,但这并不是我想要的,因为我希望我的新列名要迭代。
答案 0 :(得分:1)
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;每一次。