R:根据数值将字符串分配给数据帧

时间:2014-12-02 16:24:16

标签: r match assign

我有两个数据框.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行

1 个答案:

答案 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)))