在数据框中搜索和匹配

时间:2013-02-09 19:34:56

标签: r distance dataframe

我是R的新手,请原谅我这是非常基本的问题。使用下面的说明我编辑了这个问题,希望更有意义。

我的数据框d看起来像这样

SAMPLE <-c("blueberry", "broccoli")
OPT1 <-c("apple", "beef")
OPT2 <-c("oatmeal", "bacon")
RESPONSE <- c("oatmeal", "beef")
d <- data.frame(SAMPLE,OPT1,OPT2, RESPONSE)

为新数据添加NA列

d$OPT1.D <- rep("NA",nrow(d));

和距离矩阵dist

X <-c("blueberry", "beef", "oatmeal", "broccoli")
blueberry <-c("0", "0.17", "0.09", "0.21")
beef <-c("0.15", "0", "0.979", "0.75")
oatmeal <- c("0.09", "0.375", "0", "0.71")
broccoli <- c("0.25", "0.671", "0.45", "0")
dist <- data.frame(X,blueberry,beef, oatmeal, broccoli)

所以我想在distd$RESPONSE的{​​{1}}中找到行/列匹配。在d$SAMPLE的新列中,第一个条目应为d$OPT1.D,即0.09中“燕麦”和“蓝莓”之间的距离。第二个条目应该是dist,“牛肉”和“西兰花”之间的距离。

希望这更有意义吗?我使用下面的代码,0.671但是它返回了文本,而不是数字。非常感谢。

总的来说,这似乎应该是一个相当简单的操作,但在搜索了一下后,我无法判断这是否最好由FOR循环或像data.table这样的包完成。建议将不胜感激!

2 个答案:

答案 0 :(得分:2)

这是为矩阵索引量身定制的,这是R的一个鲜为人知但非常强大的功能。您只需要这个命令(然后重复OPT2)。

d$OPT1D <- dist[cbind(d$RESPONSE, d$OPT1)]

顺便说一句,以其他人可以轻松阅读的方式包含您的数据会很有帮助。以下是我为此做的事情。

d <- read.table(text="SAMPLE        OPT1        OPT2        RESPONSE        OPT1D        OPT2D
banana        blueberry   oatmeal     oatmeal         NA           NA
broccoli      beef        bacon       beef            NA           NA",
                 header=TRUE, stringsAsFactors=FALSE)
dist <- read.table(text="blueberry      beef           oatmeal
0              0.15           0.09
0.17           0              0.0872
0.09           0.0979         0", header=TRUE, stringsAsFactors=FALSE)
dist <- as.matrix(dist)
rownames(dist) <- colnames(dist)



> d
    SAMPLE      OPT1    OPT2 RESPONSE OPT1D OPT2D
1   banana blueberry oatmeal  oatmeal  0.09    NA
2 broccoli      beef   bacon     beef  0.00    NA

答案 1 :(得分:2)

你的第一个问题是d的类型是因子,当你试图将它用作dist [cbind(d $ RESPONSE,d $ OPT1)]中的索引时,它们被转换为整数(而不是字符)。调用data.frame时需要使用stringsAsFactors = FALSE。

d <- data.frame(SAMPLE,OPT1,OPT2, RESPONSE, stringsAsFactors=FALSE)

第二个问题是dist是一个data.frame,它没有行名。此外,您不需要X作为列。

dist <- cbind(blueberry,beef, oatmeal, broccoli)
rownames(dist) <- colnames(dist) <- X

像这样它应该做你想要的。

dist[cbind(d$RESPONSE, d$SAMPLE)]
[1] 0.090 0.671