R中数据帧列表中特定列的条件表达式

时间:2014-03-27 17:55:18

标签: r list

很抱歉,标题令人困惑。

我有一个数据框列表,组合成temp.list。我想根据vec中的值来提高特定列的每一行。例如,vec的值为2,0和3.我想这样做:X2 ^ 2,log(X2),X2 ^ 3。如果vec == 0中的值,请执行log(X2)。最后三行代码是我遇到问题的地方。

M1 <- data.frame(matrix(1:4, nrow = 2, ncol = 2))
M2 <- data.frame(matrix(1:9, nrow = 3, ncol = 3))
M3 <- data.frame(matrix(1:4, nrow = 2, ncol = 2))

mlist <- list(M1, M2, M3)
temp.list <-mlist
vec <- c(2,0,3)

以下代码有效!但我不想提高X2 ^ 0.

for(i in 1:length(vec)){
  temp.list[[i]]$X2 <- temp.list[[i]]$X2^vec[[i]]
}

下面的代码用X2中计算的第一个值替换X2的所有行。

for(i in 1:length(vec)){
  temp.list[[i]]$X2 <- ifelse(vec[[i]]==0,log(temp.list[[i]]$X2),temp.list[[i]]$X2^vec[[i]]
}

这样做的任何其他方式也将非常感激。

1 个答案:

答案 0 :(得分:1)

你可以用这个:

for(i in 1:length(vec)){
  temp.list[[i]]$X2 <- if(vec[[i]]==0) log(temp.list[[i]]$X2) 
                           else temp.list[[i]]$X2^vec[[i]]
}
temp.list
# [[1]]
#   X1 X2
# 1  1  9
# 2  2 16

# [[2]]
#   X1       X2 X3
# 1  1 1.386294  7
# 2  2 1.609438  8
# 3  3 1.791759  9

# [[3]]
#   X1 X2
# 1  1 27
# 2  2 64

问题在于ifelse(...)语句,该语句返回与条件长度相同的向量(例如,在您的情况下为1)。 if (...) ... else ...语句计算表达式并执行适当的代码块。