我是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)
所以我想在dist
和d$RESPONSE
的{{1}}中找到行/列匹配。在d$SAMPLE
的新列中,第一个条目应为d$OPT1.D
,即0.09
中“燕麦”和“蓝莓”之间的距离。第二个条目应该是dist
,“牛肉”和“西兰花”之间的距离。
希望这更有意义吗?我使用下面的代码,0.671
但是它返回了文本,而不是数字。非常感谢。
总的来说,这似乎应该是一个相当简单的操作,但在搜索了一下后,我无法判断这是否最好由FOR循环或像data.table这样的包完成。建议将不胜感激!
答案 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