![](/img/trans.png)
[英]Add a column based on the values of other two columns in the same data frame in r
[英]add column based on values in other columns data frame r
我很好奇如何解決這個問題。 我有這樣的數據框:
a b
1 0
1 0
0 1
1 1
0 0
1 0
然后輸出有一個基於“a”和“b”值的額外列:
if(a == 1&b == 1)c = 1,if(a == 1&b == 0)c = 2,if(a == 0&b == 1)c = 3,否則c = 4。
a b c
1 0 2
1 0 2
0 1 3
1 1 1
0 0 4
1 0 2
有什么想法嗎? 我不用嵌套的if-else寫一個for循環,我們怎么去vectorize? 謝謝!
為此進行了interaction
:
c(4,2,3,1)[interaction(df)]
#[1] 2 2 3 1 4 2
這也有效:
library(dplyr)
inner_join (df, cbind(expand.grid(0:1, 0:1), c=c(4, 2, 3, 1)),
by=c('a'='Var1', 'b'='Var2'))
a b c
1 1 0 2
2 1 0 2
3 0 1 3
4 1 1 1
5 0 0 4
6 1 0 2
用一點線性代數:
我們需要從等式c = 4 - x a - y b求解x,y我們可以看到x = 2,y = 1是給定變量值集的解
a b c
0 0 4
1 0 2
0 1 3
1 1 1
或者我們可以使用limSolve來解決這個過度確定的方程組:
library(limSolve)
res <- Solve(as.matrix(expand.grid(0:1, 0:1)), 4-c(4, 2, 3, 1))
res
Var1 Var2 # a = Var1, b = Var2
2 1
因此,我們有:
df$c <- 4 - res[1]*df$a - res[2]*df$b
df
a b c
1 1 0 2
2 1 0 2
3 0 1 3
4 1 1 1
5 0 0 4
6 1 0 2
將您想要的c值映射到向量,並使用a和b值作為索引(對於基於1的索引,遞增1)。
foo <- data.frame(a=c(1,1,0,1,0,1), b=c(0,0,1,1,0,0))
data.frame(foo, c=c(4:1)[foo$a*2 + foo$b + 1])
# a b c
# 1 1 0 2
# 2 1 0 2
# 3 0 1 3
# 4 1 1 1
# 5 0 0 4
# 6 1 0 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.