基于R中变量名称的Sum

时间:2017-04-07 22:50:09

标签: r

让我们说我有一个df包含ID,性别和几个数值变量,以及MAX1,MAX2和MAX3,其中

MAX1 = x1,x2,x3,x4,x5

的第一个最大值的变量名

MAX2 =第二个最大值x1,x2,x3,x4,x5的变量名

MAX3 =第三个最大值x1,x2,x3,x4,x5的变量名

### Generate data
set.seed(123)
    ID <- c(1,2,3,4,5,6,7,8,9,10)
gender <- c("m", "m", "m", "f", "f", "m", "m", "f", "f", "m")
x1 <- rnorm(10, 0, 1)
x2 <- rnorm(10, 0, 1)
x3 <- rnorm(10, 0, 1)
x4 <- rnorm(10, 0, 1)
x5 <- rnorm(10, 0, 1)
df <- data.frame(ID, gender, x1, x2, x3, x4, x5)

maxes <- t(sapply(1:nrow(df), function(i) {
    names(sort(df[i,3:7], decreasing=T)[1:3])
}))
colnames(maxes) <- c("MAX1","MAX2", "MAX3")
df <- cbind(df, maxes)

现在我需要创建一个新的列(调用ir m_sum),其总和值为MAX1和MAX2。

例如,对于ID = 1,MAX1 = x2且MAX2 = x4,则m_sum的shold等于1.2240818 + 0.42646422 = 1.650546。

2 个答案:

答案 0 :(得分:3)

如何使用apply在一次通话中完成所有操作?

df$m_sum <- apply(df, 1, function(x) as.double(x[x[ "MAX1" ]]) + as.double(x[x[ "MAX2" ]]))
 #[1] 1.65054602 0.15189652 2.45383397 3.04708946 2.02954308 3.50197809 1.39170465 0.09146139 1.48132102
#[10] 1.17044583

答案 1 :(得分:0)

console.log等因使用因素

而变得复杂

但是一个像

这样的简单循环
df$MAX1

似乎产生了

sumMAX1MAX2 <- numeric()
for (r in 1:nrow(df)){ 
    sumMAX1MAX2[r] <- df[r, as.character(df$MAX1)[r]] + 
                      df[r, as.character(df$MAX2)[r]]
    }

另一种方法是执行与> sumMAX1MAX2 [1] 1.65054602 0.15189655 2.45383398 3.04708945 2.02954308 3.50197812 [7] 1.39170470 0.09146141 1.48132102 1.17044585 类似的操作,例如

maxes