R-对照其他向量检查向量的元素
我希望将一个数据帧中的列的元素与另一个数据帧相匹配 考虑以下数据帧:R-对照其他向量检查向量的元素,r,loops,indexing,match,R,Loops,Indexing,Match,我希望将一个数据帧中的列的元素与另一个数据帧相匹配 考虑以下数据帧: A=data.frame(par=c('long A story','long C story', 'blabla D'),val=1:3) B=data.frame(par=c('Z','D','A'),val=letters[1:3]) b柱的每一个元素“PAR”应与柱PAR相匹配。 如果存在匹配项,则应将其标记为a。 [然后给出一列用于合并a和B的公共值] 因此,期望的结果是: A=transform(A,label
A=data.frame(par=c('long A story','long C story', 'blabla D'),val=1:3)
B=data.frame(par=c('Z','D','A'),val=letters[1:3])
b柱的每一个元素“PAR”应与柱PAR相匹配。
如果存在匹配项,则应将其标记为a。
[然后给出一列用于合并a和B的公共值]
因此,期望的结果是:
A=transform(A,label=c('A','NA','D'))
如何做到这一点
亨克要按你的要求去做,试试看
A=data.frame(par=c('long A story','long C story', 'blabla D'),val=1:3)
B=data.frame(par=c('Z','D','A'),val=letters[1:3])
A$label <- NA
for (x in B$par){
is.match <- lapply(A$par,function(y) grep(x, y))
A$label[which(is.match > 0)] <- x
}
A=data.frame(par=c('long A story','long c story','blablad'),val=1:3)
B=数据帧(par=c('Z','D','A'),val=字母[1:3])
$label要实现您的要求,请尝试
A=data.frame(par=c('long A story','long C story', 'blabla D'),val=1:3)
B=data.frame(par=c('Z','D','A'),val=letters[1:3])
A$label <- NA
for (x in B$par){
is.match <- lapply(A$par,function(y) grep(x, y))
A$label[which(is.match > 0)] <- x
}
A=data.frame(par=c('long A story','long c story','blablad'),val=1:3)
B=数据帧(par=c('Z','D','A'),val=字母[1:3])
$labelHi您可以执行以下操作:
list <- lapply(1:length(B$par),function(x) grep(B$par[x],A$par))
list
[[1]]
integer(0)
[[2]]
[1] 3
[[3]]
[1] 1
label <- rep("NA",length(list))
B$par <-as.character(B$par)
label[unlist(list)] <- B$par[which(list != "integer(0)")]
label
[1] "A" "NA" "D"
A <- transform(A,label=label)
A
par val label
1 long A story 1 A
2 long C story 2 NA
3 blabla D 3 D
listHi您可以这样做:
list <- lapply(1:length(B$par),function(x) grep(B$par[x],A$par))
list
[[1]]
integer(0)
[[2]]
[1] 3
[[3]]
[1] 1
label <- rep("NA",length(list))
B$par <-as.character(B$par)
label[unlist(list)] <- B$par[which(list != "integer(0)")]
label
[1] "A" "NA" "D"
A <- transform(A,label=label)
A
par val label
1 long A story 1 A
2 long C story 2 NA
3 blabla D 3 D
list在一个方便的函数中没有循环:
findkey <- function(key,terms) {
result <- sapply(as.character(key),function(x) grepl(x,terms))
result <- apply(result,1,function(x) names(x)[x==TRUE])
result[(lapply(result,length)==0)] <- NA
return(unlist(result))
}
findkey在方便的函数中没有循环:
findkey <- function(key,terms) {
result <- sapply(as.character(key),function(x) grepl(x,terms))
result <- apply(result,1,function(x) names(x)[x==TRUE])
result[(lapply(result,length)==0)] <- NA
return(unlist(result))
}
findkey我想到的方法:
M <- lapply(strsplit(as.character(A$par), " "), function(x) x[x %in% B$par])
M[sapply(M, function(x) {identical(x, character(0))})] <- NA
A$label <- unlist(M)
A
par val label
1 long A story 1 A
2 long C story 2 <NA>
3 blabla D 3 D
我想到的方法是:
M <- lapply(strsplit(as.character(A$par), " "), function(x) x[x %in% B$par])
M[sapply(M, function(x) {identical(x, character(0))})] <- NA
A$label <- unlist(M)
A
par val label
1 long A story 1 A
2 long C story 2 <NA>
3 blabla D 3 D
最后一行应该是:A=transform(A,label=c('A','NA','D'))
在transform
调用中使用大写字母A吗?您想按顺序或存在性匹配吗?感谢您在LateMail中指出错误,A应该是transform调用中的A。如果B中的值存在于A中,然后B值必须加在A上。我不担心存在的顺序。它一定是grep的某种双循环,但我无法将其排序:-(最后一行应该是:a=transform(a,label=c('a','NA','D'))
在transform
调用中使用大写a?您想按顺序还是存在进行匹配?感谢您在最近的邮件中指出错误,a应该是transform调用中的a。如果B中的值存在于a中,则必须将B值添加到a中。我不担心存在的顺序。它必须是某种与grep的双循环,但我无法解决:-(我很敬畏,爱德华…作为奖励,我不必感到我最终会想到这个!我很敬畏,爱德华…作为奖励,我不必感到我最终会想到这个!