R 数据帧中的搜索与匹配
我对R 数据帧中的搜索与匹配,r,distance,dataframe,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)
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)
因此,我想在dist
中查找d$RESPONSE
和d$SAMPLE
的行/列匹配。在d$OPT1.d
的新列中,第一个条目应为0.09
,即dist
中“燕麦”和“蓝莓”之间的距离。第二个条目应该是0.671
,“牛肉”和“花椰菜”之间的距离
希望这更有意义?我使用了下面的代码,
d$OPT1.d这是为矩阵索引量身定制的,这是R的一个鲜为人知但非常强大的功能。您所需要的就是这个命令(然后对OPT2重复)
d$OPT1D这是为矩阵索引量身定制的,这是R的一个鲜为人知但非常强大的功能。您所需要的就是这个命令(然后为OPT2重复)
d$OPT1D您的第一个问题是,d的类型是因子,当您尝试将其用作dist[cbind(d$RESPONSE,d$OPT1)]中的索引时,会将其转换为整数(而不是字符)。调用data.frame时需要使用stringsAsFactors=FALSE
d <- data.frame(SAMPLE,OPT1,OPT2, RESPONSE, stringsAsFactors=FALSE)
第一个问题是d的类型是因子,当您尝试在dist[cbind(d$RESPONSE,d$OPT1)]中将其用作索引时,会将其转换为整数(而不是字符)。调用data.frame时需要使用stringsAsFactors=FALSE
d <- data.frame(SAMPLE,OPT1,OPT2, RESPONSE, stringsAsFactors=FALSE)
还要注意,距离矩阵是不对称的,这有点可疑。作为一种实践,在这个网站上,你应该使用评论与回答的人进行交流。如果你意识到你的问题不够清楚,你应该编辑你的问题。但你们不应该在重新提问时给出答案,还要注意你们的距离矩阵是不对称的,这有点可疑。作为一种实践,在这个网站上,你应该使用评论与回答的人进行交流。如果你意识到你的问题不够清楚,你应该编辑你的问题。但你不应该在回复后再问你这个问题。
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
d <- data.frame(SAMPLE,OPT1,OPT2, RESPONSE, stringsAsFactors=FALSE)
dist <- cbind(blueberry,beef, oatmeal, broccoli)
rownames(dist) <- colnames(dist) <- X
dist[cbind(d$RESPONSE, d$SAMPLE)]
[1] 0.090 0.671