Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R ifelse基于满足两个标准的观察结果_R_If Statement - Fatal编程技术网

R ifelse基于满足两个标准的观察结果

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

是的,这是一个非常简单的问题,我知道这是一个合乎逻辑的方法。我有两个数据帧,希望在第一个数据帧0/1中创建一个新列,这取决于第二个数据帧中是否有任何行包含第一个数据帧中的col1/col2对

资料

显而易见的方法是检查第二个df中是否存在名称-等级对:

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作为奖金!