匹配多行以查找值 - 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,请阅读帮助文件以了解差异。
我认为这很相似,但与我在此处提出的先前问题不同
这是我现在使用的代码:
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,请阅读帮助文件以了解差异。