匹配多行以查找值 - R

Matching Multiple Rows To Find A Value - R

我认为这很相似,但与我在此处提出的先前问题不同

这是我现在使用的代码:

City <- c("x","x","y","y","z","z")
Type <- c("a","b","a","b","a","b")
Value <- c(1,3,2,5,6,10)
cbind.data.frame(City,Type,Value)

产生:

    City Type Value
1    x    a     1
2    x    b     3
3    y    a     2
4    y    b     5
5    z    a     6
6    z    b    10

我想做一些与以前类似的事情,但现在如果必须满足两个不同的条件才能提取特定数字。假设我们有一个矩阵,

testmat <- matrix(c("x","x","y","a","b","b"),ncol=2)

看起来像这样:

    [,1] [,2]
[1,] "x"  "a" 
[2,] "x"  "b" 
[3,] "y"  "b" 

期望的结果是

     [,1] [,2] [,3]
[1,] "x"  "a"   1 
[2,] "x"  "b"   3 
[3,] "y"  "b"   5

另一个问题请回答这部分

City <- c("x","x","x","x","y","y","x","z")
Type <- c("a","a","a","a","a","b","a","b")

Value <- c(1,3,2,5,6,10,11,15)

mat <- cbind.data.frame(City,Type,Value)
mat
testmat <- matrix(c("y","x","b","a"),ncol=2)
testmat <- data.frame(testmat)
testmat

test <- inner_join(mat,testmat,by = c("City"="X1", "Type"="X2"))

为什么当我尝试使用 inner_join 函数时它会给我一条警告消息。这是我收到的警告消息....

In inner_join_impl(x, y, by$x, by$y) : joining factors with different levels, coercing to character vector

这是期望的输出,是...

    City Type Value
1    y    b    10
2    x    a     1
3    x    a     3
4    x    a     2
5    x    a     5
6    x    a    11

但它正在生产...

    City Type Value
1    x    a     1
2    x    a     3
3    x    a     2
4    x    a     5
5    y    b    10
6    x    a    11

我希望 inner_join 函数生成它们首先出现在测试垫中的值,如上所示。因此,如果由于 "b" 类型的城市 "y" 在测试垫中排在第一位,我希望它在 "test"

的值中排在第一位

解决办法就是调换testmat和mat的顺序,像这样..

test <- inner_join(testmat,mat,by = c("X1"="City", "X2"="Type"))

我觉得有趣的是,by 参数的顺序需要与通过 innerjoin 函数传递的数据帧的顺序相同。

警告是因为 R 将字符串向量视为因子类型。您可以通过 运行 脚本开头的以下代码更改此行为:

 options(stringsAsFactors = FALSE)

第二部分答案: 警告指出,您尝试加入两个不同级别的因素。因此,变量在加入之前被强制转换为 "character" ,这没有问题。正如 Mostafa Rezaei 在他的回答中提到的那样,R 是在创建数据框时来自字符向量的强制因素。通常最好留下字符:

mat <- data.frame(City,Type,Value, stringsAsFactors=F)
testmat <- data.frame(testmat, stringsAsFactors=F)


关于您的真实问题:

未定义联接结果的顺序。如果顺序对你很重要,你可以使用一个额外的排序变量:

mat %>% 
mutate(rn = row_number()) %>%
semi_join(testmat, by = c("City"="X1", "Type"="X2")) %>%
arrange(rn)

顺便说一句:我认为您正在寻找 semi_join 而不是 inner_join,请阅读帮助文件以了解差异。