我越来越熟悉R并碰到了我以前没想过的东西。在线阅读和搜索并没有让我更接近解决方案。
目标:获取源表(s_col)中的每一行,并将其与目标表(t_col)中的每一行进行匹配。创建一个新的df,其中1表示匹配,0表示没有匹配或源值为NA。
数据:
> s_col<-data.frame(col1=c("Bob", "aunt"),
col2= ("likes", "Cathy"), col3 = c(NA, "tea"))
> s_col
col1 col2 col3
1 Bob likes tea
2 aunt Cathy <NA>
3 Tom wins twice
> t_col<-data.frame(col1=c("Bob", NA, "likes", "tea", "Jack"),
col2=c("Cathy", "aunt", "Jason", "Bob", "likes"))
> t_col
col1 col2
1 Bob Cathy
2 <NA> aunt
3 likes Jason
4 tea Bob
5 Jack likes
期望的结果:
#output for first row in s_col (Bob, likes, tea)
col1 col2
1 1 0
2 0 0
3 1 0
4 1 1
5 0 1
#output for 2nd row in s_col (aunt, Cathy, NA)
col1 col2
1 0 1
2 0 1
3 0 0
4 0 0
5 0 0
#output for 3nd row in s_col (Tom, wins, twice)
col1 col2
1 0 0
2 0 0
3 0 0
4 0 0
5 0 0
到目前为止,这是我所取得的进展,但下面的代码远非预期的结果:
out<-NULL
output<-NULL
for(i in 1:ncol(s_col)){
x<-i
for(j in 1:nrow(s_col)){
y<-j
temp<- s_col[y,x]
for(a in 1:ncol(t_col)){
w<-a
for(b in 1:nrow(t_col)){
v<-b
temp2<- t_col[v,w]}}
put<-ifelse(temp %in% temp2, 1, 0)
out<-c(out,put)
}
答案 0 :(得分:2)
我们可以遍历s_col
行,然后使用%in%
与&#39; t_col&#39;的列进行比较。创建list
逻辑matric
es
lapply(seq_len(nrow(s_col)), function(i) +sapply(t_col, `%in%`, unlist(s_col[i,])))
#[[1]]
# col1 col2
#[1,] 1 0
#[2,] 0 0
#[3,] 1 0
#[4,] 1 1
#[5,] 0 1
#[[2]]
# col1 col2
#[1,] 0 1
#[2,] 1 1
#[3,] 0 0
#[4,] 0 0
#[5,] 0 0
#[[3]]
# col1 col2
#[1,] 0 0
#[2,] 0 0
#[3,] 0 0
#[4,] 0 0
#[5,] 0 0
s_col<-data.frame(col1=c("Bob", "aunt", "Tom"),
col2= c("likes", "Cathy", "wins"), col3 = c("tea", NA, "twice"), stringsAsFactors=FALSE)