R ifelse基于满足两个标准的观察结果
是的,这是一个非常简单的问题,我知道这是一个合乎逻辑的方法。我有两个数据帧,希望在第一个数据帧0/1中创建一个新列,这取决于第二个数据帧中是否有任何行包含第一个数据帧中的col1/col2对 资料 显而易见的方法是检查第二个df中是否存在名称-等级对:R ifelse基于满足两个标准的观察结果,r,if-statement,R,If Statement,是的,这是一个非常简单的问题,我知道这是一个合乎逻辑的方法。我有两个数据帧,希望在第一个数据帧0/1中创建一个新列,这取决于第二个数据帧中是否有任何行包含第一个数据帧中的col1/col2对 资料 显而易见的方法是检查第二个df中是否存在名称-等级对: df.ex1$bin <- ifelse(df.ex1[,1:2] %in% df.ex2[,1:2], 1, 0) 但这不起作用。为什么不呢?正确的方法是什么?事实上,达到正确方法的正确思维过程是什么 注意,这显然不起作用: df.ex
df.ex1$bin <- ifelse(df.ex1[,1:2] %in% df.ex2[,1:2], 1, 0)
但这不起作用。为什么不呢?正确的方法是什么?事实上,达到正确方法的正确思维过程是什么
注意,这显然不起作用:
df.ex1$bin <- ifelse(df.ex1[,1] %in% df.ex2[,1] & df.ex1[,2] %in% df.ex2[,2], 1, 0)
您可能首先在寻找基于连接的内容:
df.ex2$bin <- 1
res <- merge(df.ex1,df.ex2,all.x = TRUE)
res$bin <- ifelse(is.na(res$bin),0,1)
> res
name grade1 bin
1 ben F 1
2 joe B 0
3 nick A 0
4 sally A 1
使用其他流行的软件包(如dplyr或data.table)将有许多相同的方法来实现这一点。您可能首先在寻找基于连接的东西:
df.ex2$bin <- 1
res <- merge(df.ex1,df.ex2,all.x = TRUE)
res$bin <- ifelse(is.na(res$bin),0,1)
> res
name grade1 bin
1 ben F 1
2 joe B 0
3 nick A 0
4 sally A 1
使用其他流行的软件包,如dplyr或data.table,将有许多等效的方法来实现这一点。您可以使用data.table更新连接
library(data.table)
setDT(df.ex1)
setDT(df.ex2)
df.ex1[, bin := 0]
df.ex1[df.ex2, on = .(name, grade1), bin := 1]
df.ex1
# name grade1 bin
# 1: sally A 1
# 2: joe B 0
# 3: ben F 1
# 4: nick A 0
您可以使用data.table更新联接
library(data.table)
setDT(df.ex1)
setDT(df.ex2)
df.ex1[, bin := 0]
df.ex1[df.ex2, on = .(name, grade1), bin := 1]
df.ex1
# name grade1 bin
# 1: sally A 1
# 2: joe B 0
# 3: ben F 1
# 4: nick A 0
您可以通过交互将这两列连接在一起,然后像以前一样在%中使用%
df.ex1$bin <- ifelse(interaction(df.ex1[,1:2]) %in% interaction(df.ex2[,1:2]), 1, 0)
df.ex1
# name grade1 bin
#1 sally A 1
#2 joe B 0
#3 ben F 1
#4 nick A 0
然后将这两个因子/向量应用于%in%
或者,您可以使用类似以下内容的粘贴:
在这里,粘贴与交互具有相同的效果。它将两列连接在一起,形成一个向量
df.ex1[,1:2] #gives you a data.frame
# name grade1
#1 sally A
#2 joe B
#3 ben F
#4 nick A
interaction(df.ex1[,1:2]) #gives you a factor
#sally.A joe.B ben.F nick.A
do.call(paste, df.ex1[,1:2])
#"sally A" "joe B" "ben F" "nick A"
您可以通过交互将这两列连接在一起,然后像以前一样在%中使用%
df.ex1$bin <- ifelse(interaction(df.ex1[,1:2]) %in% interaction(df.ex2[,1:2]), 1, 0)
df.ex1
# name grade1 bin
#1 sally A 1
#2 joe B 0
#3 ben F 1
#4 nick A 0
然后将这两个因子/向量应用于%in%
或者,您可以使用类似以下内容的粘贴:
在这里,粘贴与交互具有相同的效果。它将两列连接在一起,形成一个向量
df.ex1[,1:2] #gives you a data.frame
# name grade1
#1 sally A
#2 joe B
#3 ben F
#4 nick A
interaction(df.ex1[,1:2]) #gives you a factor
#sally.A joe.B ben.F nick.A
do.call(paste, df.ex1[,1:2])
#"sally A" "joe B" "ben F" "nick A"
这对于ifelse来说太复杂了,因为您不仅要检查df1中的特定名称和等级1是否在df2中。您正在检查名称和等级1值是否在同一行的df2中。这对于ifelse来说太复杂了,因为您不仅仅是检查df1中的特定名称和等级1是否在df2中。您正在检查名称和等级1值是否在同一行的df2中。我最后使用了另一个答案,但这一个似乎是最可读的。我读过“互动”文档,但并不真正理解——这里的“互动”是什么?就看这两个细胞?谢谢,我认为这是最有意义的,它的基础R作为奖金!我最后使用了另一个答案,但这一个似乎是最可读的。我读过“互动”文档,但并不真正理解——这里的“互动”是什么?就看这两个细胞?谢谢,我认为这是最有意义的,它的基础R作为奖金!