通过不同的向量乘以数据帧的各种子集

jsl*_*che 4 r vector subset multiplying

我想用数值向量乘以数据框中的几列.值的特定向量根据另一列中的值而变化.

- 编辑 -

如果我使数据集更复杂,即超过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")
  )
Run Code Online (Sandbox Code Playgroud)

看起来像:

 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
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

我已尝试对数据帧进行子集化并乘以向量:

t(t(subset(df[,3:5],df[,6]=="A")) * c(1,2,3))
Run Code Online (Sandbox Code Playgroud)

但是我不能将子集化数据帧返回到原始数据帧.有没有办法在不对数据框进行子集化的情况下执行此操作,以便保留其他列(例如,处理,物种)?

Jos*_*ich 9

这是一个相当普遍的解决方案,您应该能够适应您的需求.

请注意,在第一个参数outer呼叫是逻辑向量和第二是数字,所以乘法之前TRUEFALSE被转换为10,分别.我们可以添加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
Run Code Online (Sandbox Code Playgroud)