很抱歉,标题令人困惑。
我有一个数据框列表,组合成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]]
}
这样做的任何其他方式也将非常感激。
答案 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 ...
语句计算表达式并执行适当的代码块。