我有两个数据框.data2 $ v1中行的顺序与data1中列的顺序相对应,但列data1 $匹配。
data1 <- data.frame(hellore = c(.05, .8, .9 ), internationality = c(1,.03,1), matched = c("hello", "international", "hero"))
data2 <- data.frame(v1 = c("hellore", "internationality"))
我需要一个算法,它在data1的每一列中寻找最小值(另一个要求是值必须低于0.05),并在data1 $中匹配data2 $ v2中的相应字符串。结果应如下所示:
data.final <- data.frame(v1 = c("hellore", "internationality"), v2 = c("hello", "international"))
我试过这个,但它不是动态的:
data2$v2 <- NA
values=data1$matched[which(min(data1[,1]) & (data1[,1] <= 0.05))]
data2[1,2] <- paste(values)
values=data1$matched[which(min(data1[,2]) & (data1[,2] <= 0.05))]
data2[2,2] <- paste(values)
任何人都知道如何解决这个向量化的问题?
更新
THX!以下解决方案适用于上述示例。现在我遇到的问题是,如果data1中没有相应的值,则行的长度不同,我不能再将字符串分配给data2。请参阅代码和错误消息:
data1 <- data.frame(hellore = c(.05, .8, .9 ), internationality = c(1,.03,1), matched = c("hello", "international", "hero"))
data2 <- data.frame(v1 = c("hellore", "internationality", "bonbon"))
idx <- unlist(unname(sapply(data1[-3], function(x) if(min(x) <= 0.05) which.min(x))))
data2$v2 <- data1$matched[idx]
$<-.data.frame
中的错误(*tmp*
,“v2”,值= c(1L,3L)):
替换有2行,数据有3行
答案 0 :(得分:2)
您可以尝试以下方法(但是,它不会被矢量化,因为它使用sapply
):
idx <- unlist(unname(sapply(data1[-3], function(x) if(min(x) <= 0.05) which.min(x))))
data2$v2 <- data1$matched[idx]
对于更新的示例,您可以使用以下调整后的代码:
idx <- unlist(unname(sapply(data1[-3], function(x) if(min(x) <= 0.05) which.min(x))))
data2$v2 <- c(as.character(data1$matched[idx]), rep(NA, nrow(data2) - length(idx)))