使用dplyr根据R中包含2个数据帧的规则过滤行?

时间:2017-11-12 10:47:27

标签: r dataframe dplyr

我有2个数据帧:

t:
med score
a   3
b   1
v   2
c   2
f   1

p:
  med score
    a   1
    b   1
    v   2
    c   3
    f   3

我正在使用dplyr包来过滤得分== 1的所有行:

t %>% filter(score == 1)

我得到了:

med score
b   1
f   1

我想去p df,过滤上面的行(b,f)并将它们更新为3。 出于某种原因,p %>% filter(med == t[[1]])无效。

请告知我如何实现上述目标。

P.S 这就是我在做的事情:

temp <- p %>% filter(score == 1)

我想做这样的事情:

n <- filter(t, med == temp[[1]])

然后根据subf n将t的分数更新为例如。

1 个答案:

答案 0 :(得分:2)

t = read.table(text = "
               med score
               a   3
               b   1
               v   2
               c   2
               f   1
               ", header = T, stringsAsFactors = F)

p = read.table(text = "
               med score
               a   1
               b   1
               v   2
               c   3
               f   3
               ", header = T, stringsAsFactors = F)

# get the med values from p where score = 1
# save them as a vector
med_p = p$med[p$score == 1]

# update values in corresponding rows of t
t$score[t$med %in% med_p] = 3

# updated t
t

#   med score
# 1   a     3
# 2   b     3
# 3   v     2
# 4   c     2
# 5   f     1

你在评论中提到了一些功能,所以如果这是一个更大的过程的一部分你可以使用这个过程(我的答案)作为一个函数:

t = read.table(text = "
               med score
               a   3
               b   1
               v   2
               c   2
               f   1
               ", header = T, stringsAsFactors = F)

p = read.table(text = "
               med score
               a   1
               b   1
               v   2
               c   3
               f   3
               ", header = T, stringsAsFactors = F)

UpdateTable = function(dt_to_update, dt_control, input, update) {
    med_p = dt_control$med[dt_control$score == input]
    dt_to_update$score[dt_to_update$med %in% med_p] = update
    dt_to_update
    }

# old version
t

#   med score
# 1   a     3
# 2   b     1
# 3   v     2
# 4   c     2
# 5   f     1

# update version using the function
UpdateTable(t,p,1,3)

#   med score
# 1   a     3
# 2   b     3
# 3   v     2
# 4   c     2
# 5   f     1