我想把数据框中的几列乘以一个值的向量。值的特定向量根据另一列中的值而变化。
-编辑--
如果我使数据集变得更加复杂,例如,超过2个条件,并且这些条件在数据集周围随机打乱,该怎么办?
以下是我的数据集的一个示例:
df=data.frame(
Treatment=(rep(LETTERS[1:4],each=2)),
Species=rep(1:4,each=2),
Value1=c(0,0,1,3,4,2,0,0),
Value2=c(0,0,3,4,2,1,4,5),
Value3=c(0,2,4,5,2,1,4,5),
Condition=c("A","B","A","C","B","A","B","C")
)看起来是这样的:
Treatment Species Value1 Value2 Value3 Condition
A 1 0 0 0 A
A 1 0 0 2 B
B 2 1 3 4 A
B 2 3 4 5 C
C 3 4 2 2 B
C 3 2 1 1 A
D 4 0 4 4 B
D 4 0 5 5 C如果为Condition=="A",我想将第3-5列乘以向量c(1,2,3)。如果为Condition=="B",我想将第3-5列乘以向量c(4,5,6)。如果为Condition=="C",我想将第3-5列乘以向量c(0,1,0)。因此,生成的数据帧将如下所示:
Treatment Species Value1 Value2 Value3 Condition
A 1 0 0 0 A
A 1 0 0 12 B
B 2 1 6 12 A
B 2 0 4 0 C
C 3 16 10 12 B
C 3 2 2 3 A
D 4 0 20 24 B
D 4 0 5 0 C我试着对数据帧进行子化,然后乘以向量:
t(t(subset(df[,3:5],df[,6]=="A")) * c(1,2,3))但我不能将子集的数据帧返回到原始数据帧。有没有办法在不对数据帧设置子集的情况下执行此操作,以便保留其他列(例如,处理、物种)?
发布于 2011-07-30 07:07:33
这里有一个相当通用的解决方案,您应该能够适应您的需求。
注意,outer调用中的第一个参数是逻辑向量,第二个参数是数值,因此在乘法之前,TRUE和FALSE将分别转换为1和0。我们可以添加outer结果,因为条件是不重叠的,并且FALSE元素将为零。
multiples <-
outer(df$Condition=="A",c(1,2,3)) +
outer(df$Condition=="B",c(4,5,6)) +
outer(df$Condition=="C",c(0,1,0))
df[,3:5] <- df[,3:5] * multiples发布于 2011-07-30 05:07:46
编辑以反映评论中的一些注释
假设Condition是一个因素,您可以这样做:
#Modified to reflect OP's edit - the same solution works just fine
m <- matrix(c(1:6,0,1,0),3,3,byrow = TRUE)
df[,3:5] <- with(df,df[,3:5] * m[Condition,])这利用了相当快的矢量化乘法。显然,将它包装在with中并不是绝对必要的,它只是从我的大脑中突然冒出来的东西。还要注意Backlin下面的子集注释。
更全面地说,记住你可以用subset做的每个子集,你也可以用[做,更重要的是,[支持通过[<-进行赋值。因此,如果你想改变数据框或矩阵的一部分,你总是可以使用这种类型的习惯用法:
df[rowCondition,colCondition] <- <replacement values>当然,假设<replacement values>与您的df子集具有相同的维度。它可能会以其他方式工作,但你会与R的回收规则发生冲突,R可能会反击警告。
发布于 2011-07-30 06:41:52
这是一个非矢量化的,但易于理解的解决方案:
replaceFunction <- function(v){
m <- as.numeric(v[3:5])
if (v[6]=="A")
out <- m * c(1,2,3)
else if (v[6]=="B")
out <- m * c(4,5,6)
else
out <- m
return(out)
}
g <- apply(df, 1, replaceFunction)
df[3:5] <- t(g)
dfhttps://stackoverflow.com/questions/6878899
复制相似问题