我认为这是类似的,但它与我之前在此问过的问题不同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”的值中
答案 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,请阅读帮助文件中的差异。