R 从一个数据帧到另一个数据帧按位置获取元素

R 从一个数据帧到另一个数据帧按位置获取元素,r,R,假设我们有两个数据帧: df1 <- data.frame(A = letters[1:3], B = letters[4:6], C = letters[7:9], stringsAsFactors = FALSE) A B C 1 a d g 2 b e h 3 c f i df2 <- data.frame(V1 = 1:3, V2 = 4:6, V3 = 7:9) V1 V2 V3 1 1 4 7 2 2 5 8 3 3 6 9 这就是我迄今为止

假设我们有两个数据帧:

df1 <- data.frame(A = letters[1:3], B = letters[4:6], C = letters[7:9], stringsAsFactors = FALSE)
  A B C
1 a d g
2 b e h
3 c f i

df2 <- data.frame(V1 = 1:3, V2 = 4:6, V3 = 7:9)
  V1 V2 V3
1  1  4  7
2  2  5  8
3  3  6  9
这就是我迄今为止所尝试的:

requiere(dplyr)
toVec   <- function(df) df %>% as.matrix %>% as.vector
matchdf <- function(values, dfin, dfout) toVec(dfout)[toVec(dfin) %in% values]

# But sometimes the output values aren't in correct order:
> matchdf(c("c", "i", "h"), dt1, dt2)
[1] 3 8 9
# should output 3 9 8

> matchdf(values = c("a", "a", "a"), dfin = dt1, dfout = dt2)
[1] 1
# Should output 1 1 1
requiree(dplyr)
toVec%as.matrix%>%as.vector

matchdf
matchdf
matchdf在我看来,你走上了正确的道路。与其将数据帧转换为向量,不如先处理向量。另外,我会做一些类似于
values=c(“a”,“e”,“I”);unlist(df2)[match(values,unlist(df1))]
而不是使用dplyr并创建两个函数。@davidernburg如果可以的话,你应该发布你的答案在我看来你走对了方向。与其将数据帧转换为向量,不如先处理向量。另外,我会做一些类似于
values=c(“a”,“e”,“I”);unlist(df2)[match(values,unlist(df1))]
而不是使用dplyr并创建两个函数。@davidernburg它可以工作,你应该发布你的答案这两个答案都是错误的,因为这只是一个没有任何解释的代码转储(对未来的读者来说是无用的)这是一个糟糕的答案,因为这只是一个没有任何解释的代码转储(这对未来的读者来说是无用的),也因为它教用户在完全矢量化的操作上运行循环。
requiere(dplyr)
toVec   <- function(df) df %>% as.matrix %>% as.vector
matchdf <- function(values, dfin, dfout) toVec(dfout)[toVec(dfin) %in% values]

# But sometimes the output values aren't in correct order:
> matchdf(c("c", "i", "h"), dt1, dt2)
[1] 3 8 9
# should output 3 9 8

> matchdf(values = c("a", "a", "a"), dfin = dt1, dfout = dt2)
[1] 1
# Should output 1 1 1
matchdf <- function(values, dfin, dfout){
        unlist(sapply(values, 
                      function(val) dfout[dfin == val], 
                      USE.NAMES = F)
               )
}

matchdf(c("c", "i", "h"), df1, df2)
#should output 3 9 8
[1] 3 9 8
matchdf(values = c("a", "a", "a"), dfin = df1, dfout = df2)
#should output 1 1 1
[1] 1 1 1
matchdf(values = c("X", "Y", "a"), dfin = df1, dfout = df2)
#should output vector, not list
[1] 1