根据其他列数据框 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" 的值:
如果(a==1&b==1)c=1,如果(a==1&b==0)c=2,如果(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 循环,我们如何进行矢量化?谢谢!
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 - xa - yb 中求解 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
我很好奇如何解决这个问题。我有这样的数据框:
a b
1 0
1 0
0 1
1 1
0 0
1 0
然后输出有一个额外的列基于 "a" 和 "b" 的值:
如果(a==1&b==1)c=1,如果(a==1&b==0)c=2,如果(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 循环,我们如何进行矢量化?谢谢!
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 - xa - yb 中求解 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