如何在r中实现此计数?
我的两个数据帧:如何在r中实现此计数?,r,dataframe,R,Dataframe,我的两个数据帧: df1 Col1 A B C df2 Col1 A D E F 我想在df1中添加第二列Col2,如果Col1中的各个值也在df2的Col1中,那么该列中的每个值都是1。因此,df1将如下所示: df1 Col1 Col2 A 1 B 0 C 0 谢谢 df3是最终输出 library(dplyr) df
df1
Col1
A
B
C
df2
Col1
A
D
E
F
我想在df1中添加第二列Col2,如果Col1中的各个值也在df2的Col1中,那么该列中的每个值都是1。因此,df1将如下所示:
df1
Col1 Col2
A 1
B 0
C 0
谢谢 df3是最终输出
library(dplyr)
df1 <- data_frame(Col1 = c("A", "B", "C"))
df2 <- data_frame(Col1 = c("A", "D", "E", "F"))
df3 <- df1 %>% mutate(Col2 = as.numeric(Col1 %in% df2$Col1))
df3
是最终输出
library(dplyr)
df1 <- data_frame(Col1 = c("A", "B", "C"))
df2 <- data_frame(Col1 = c("A", "D", "E", "F"))
df3 <- df1 %>% mutate(Col2 = as.numeric(Col1 %in% df2$Col1))
将col2添加到df2
df2$Col2 <- 1
编辑:@ycw使用作为.numeric
和%中的%。我喜欢他的答案,但我想我应该编辑我的答案,加入一个不使用dplyr的版本:
只需将Col2添加到df2即可
df2$Col2 <- 1
编辑:@ycw使用作为.numeric
和%
中的%。我喜欢他的答案,但我想我应该编辑我的答案,加入一个不使用dplyr的版本:
使用data.table
第一个使用%chin%
运算符:
库(data.table)
x=数据表(v=字母[1:3])
y=数据表(v=c(“A”、“D”、“E”、“F”))
x[,发现:=v%chin%y$v]
x
#>v发现
#>1:真的吗
#>2:B错
#>3:C错误
第二个基于合并行为:
库(data.table)
x=数据表(v=字母[1:3])
y=数据表(v=c(“A”、“D”、“E”、“F”))
y[,发现:=TRUE]
x[,found:=y[.SD,(.ifelse(is.na(found),FALSE,TRUE)),on=(v)]]
x
#>v发现
#>1:真的吗
#>2:B错
#>3:C错误
编辑:基于@frank comment,您可以在不使用的情况下进行简化,如果没有其他
——这是一样的
x[,found:=y[.SD,!is.na(found),on=(v)]]
x
#>v发现
#>1:真的吗
#>2:B错
#>3:C错误
为了了解发生了什么,以下是我构建的内部代码:
x[,发现:=NULL]
y[x,on=(v)]
#>v发现
#>1:真的吗
#>2:B不适用
#>3:CNA
使用数据表的两个选项
第一个使用%chin%
运算符:
库(data.table)
x=数据表(v=字母[1:3])
y=数据表(v=c(“A”、“D”、“E”、“F”))
x[,发现:=v%chin%y$v]
x
#>v发现
#>1:真的吗
#>2:B错
#>3:C错误
第二个基于合并行为:
库(data.table)
x=数据表(v=字母[1:3])
y=数据表(v=c(“A”、“D”、“E”、“F”))
y[,发现:=TRUE]
x[,found:=y[.SD,(.ifelse(is.na(found),FALSE,TRUE)),on=(v)]]
x
#>v发现
#>1:真的吗
#>2:B错
#>3:C错误
编辑:基于@frank comment,您可以在不使用的情况下进行简化,如果没有其他
——这是一样的
x[,found:=y[.SD,!is.na(found),on=(v)]]
x
#>v发现
#>1:真的吗
#>2:B错
#>3:C错误
为了了解发生了什么,以下是我构建的内部代码:
x[,发现:=NULL]
y[x,on=(v)]
#>v发现
#>1:真的吗
#>2:B不适用
#>3:CNA
没有dplyr的替代方案:df1$Col2=as.numeric(df1$Col1%在%df2$Col1中)
出于某种原因,我得到了:库中的错误(dplyr):没有名为'dplyr'的包知道有什么问题吗?您是否已将dplyr安装为install.packages('dplyr')
Nevermind,我使用了@Florian的答案并使用了cbind()把它粘回到df1上。谢谢@Florian@RaiderNAYSHUN也许您可以标记HarlandMason的答案,让其他人知道这个问题已经得到了回答。没有dplyr的替代方案:df1$Col2=as.numeric(df1$Col1%in%df2$Col1)
出于某种原因,我得到了:库中的错误(dplyr):没有名为“dplyr”的软件包知道有什么问题吗?您是否已将dplyr安装为install.packages('dplyr')
Nevermind,我使用@Florian的答案并使用cbind()将其粘贴到df1上。谢谢@Florian@也许你可以标记哈兰梅森的答案,让其他人知道这个问题已经得到了回答。很好的解决方案。感谢您为我的方法添加了基本的R解决方案。很好。另一个版本:df1$found=!is.na(merge(df1,transform(df2,z=1),all.x=TRUE)$z)
。请注意,%
中的%与此答案(允许合并多个列)相比具有限制性。这是一个不错的解决方案。感谢您为我的方法添加了基本的R解决方案。很好。另一个版本:df1$found=!is.na(merge(df1,transform(df2,z=1),all.x=TRUE)$z)
。请注意,%
中的%与此答案(允许合并多个列)相比具有限制性。这是一个好主意。仅供参考,ifelse
通常不鼓励使用,因为在这种情况下,我想您可以使用!而是.na(找到)
。是的,你是对的。我不知道我错过了。我更新了答案,这是个好主意。仅供参考,ifelse
通常不鼓励使用,因为在这种情况下,我想您可以使用!而是.na(找到)
。是的,你是对的。我不知道我错过了。我更新答案。
df3$Col2[which(is.na(df3$Col2))] <- 0
Col1 Col2
1 A 1
2 B 0
3 C 0