如何比较R中两个数据框的行

时间:2019-11-19 16:45:37

标签: r dataframe dplyr

我正在尝试比较两列不同的数据框架以创建一个新的数据框架。如果第一个col的行的值小于第二个col的行,它将在新列中添加1。值较大时,将添加2,依此类推。

我给你举个例子。我有这个df

static func retrieveCurrentSSID(  callback: @escaping ( String? ) -> Void ){
    NEHotspotConfigurationManager.shared.getConfiguredSSIDs { ( networkSSIDs ) in
        callback( networkSSIDs.first )
    }
}

这是行数较少的

df1 <- data.frame(col=c(1,seq(1:9),9,10))
# col
# 1    1
# 2    1
# 3    2
# 4    3
# 5    4
# 6    5
# 7    6
# 8    7
# 9    8
# 10   9
# 11   9
# 12  10

现在,我的愿望输出将类似于以下内容:

df2<-data.frame(col2=c(3,6,8))
#    col2
# 1    3
# 2    6
# 3    8

我知道这是一个非常基本的问题,但是如果不使用for循环,我将无法轻松地做到这一点。我虽然要使用# col3 # 1 1 # 2 1 # 3 1 # 4 2 # 5 2 # 6 2 # 7 3 # 8 3 # 9 4 # 10 4 # 11 4 # 12 4 选择第一个元素,然后使用!unique()来查看是否在第二个元素中,但是不知道如何实现它。

2 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,我认为这会起作用:

apply(df1, 1, FUN = function(x) 1 + sum(x >= df2$col2))
# [1] 1 1 1 2 2 2 3 3 4 4 4 4

我们使用apply遍历df1的行,然后检查每一行中的值以查看其与col2中的df2的比较。

一个dplyr替代方案:

library(dplyr)
df1 %>%
    rowwise() %>% # group over each row
    mutate(col3 = 1 + sum(col >= df2$col2))

     col  col3
   <dbl> <dbl>
 1     1     1
 2     1     1
 3     2     1
 4     3     2
 5     4     2
 6     5     2
 7     6     3
 8     7     3
 9     8     4
10     9     4
11     9     4
12    10     4

答案 1 :(得分:1)

希望这能帮到你

z <- rep(F,nrow(df1))
z[c(1,df2$col2+1)]<- T
df1$col3 <- cumsum(z)

给出

> df1
   col col3
1    1    1
2    1    1
3    2    1
4    3    2
5    4    2
6    5    2
7    6    3
8    7    3
9    8    4
10   9    4
11   9    4
12  10    4