2

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)

所以我想在distford$RESPONSE和中找到行/列匹配d$SAMPLE。在 的新列中d$OPT1.D,第一个条目应该是0.09,即 'oatmeal' 和 'blueberry' 之间的距离dist。第二个条目应该是0.671“牛肉”和“西兰花”之间的距离。

希望这更有意义?我使用了下面的代码,d$OPT1.D <- dist[cbind(d$RESPONSE, d$SAMPLE)]但它返回的是文本,而不是数字。非常感谢。

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

4

2 回答 2

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
于 2013-02-10T03:25:17.937 回答
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
于 2013-02-09T20:11:14.483 回答