匹配多行以查找值 - R.

时间:2015-08-04 19:43:06

标签: r matrix subset

我认为这是类似的,但它与我之前在此问过的问题不同Pull specific rows

以下是我正在使用的代码:

ObjectifyFilter

产生:

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

为什么当我尝试使用inner_join函数时,它会给我一个警告信息。这是我得到的警告信息......

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"))

这是所需的输出,是......

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

我希望inner_join函数能够生成首先在testmat中显示它们的值,如上所示。因此,如果因为类型为“b”的城市“y”在testmat中排在第一位,我希望它首先出现在“test”的值中

3 个答案:

答案 0 :(得分:2)

解决方案是只需切换testmat和mat的顺序,就像这样..

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

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

答案 1 :(得分:0)

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

 options(stringsAsFactors = FALSE)

答案 2 :(得分:0)

回答第二部分: 警告声明,您尝试加入具有不同级别的两个因子。因此,变量被强制转换为&#34;字符&#34;在加入之前,没有问题。正如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)

btw:我认为你在寻找一个semi_join而不是inner_join,请阅读帮助文件中的差异。