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)
但是我不能将子集化数据帧返回到原始数据帧.有没有办法在不对数据框进行子集化的情况下执行此操作,以便保留其他列(例如,处理,物种)?
这是一个相当普遍的解决方案,您应该能够适应您的需求.
请注意,在第一个参数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
Run Code Online (Sandbox Code Playgroud)