结合管道和哪个.min

时间:2018-03-07 15:04:03

标签: r dplyr

对于列ABCD的数据框,我想要提取B其中{的值{1}}最接近例如1 ACstring1D

我试图使用管道运算符string2来实现

%>%

哪个不起作用。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您需要将with添加到代码的最后一行,告诉which.min它必须在那里寻找A.

my.df %>%
  filter(C == 'a') %>%
  filter(D == 'A') %>%
  with(which.min(abs(A - 1)))
# [1] 1

要提取B的值,您可以使用top_n获取整行,然后使用select(B) / pull(B),如下所示:

my.df %>%
  filter(C == 'a') %>%
  filter(D == 'A') %>%
  top_n(1, -abs(A - 1)) %>% 
  select(B)

# A tibble: 1 x 1
#         B
#     <int>
#   1    11

如果您使用带有负号的top_n,则会选择最小值,否则为最大值。

数据

my.df <- tibble(A = 1:6, B = 11:16, C = rep(letters[1:3], 2), D = rep(LETTERS[1:3], 2))

my.df
# A tibble: 6 x 4
#       A     B C     D    
#   <int> <int> <chr> <chr>
# 1     1    11 a     A    
# 2     2    12 b     B    
# 3     3    13 c     C    
# 4     4    14 a     A    
# 5     5    15 b     B    
# 6     6    16 c     C    

答案 1 :(得分:0)

这样可行:

df %>%
  mutate(A1 = (abs(A - 1))) %>%
  filter(C=='A' & D == 'B') %>%
  filter(A1 == min(A1)) %>%
  select(B)

#          B
# 1 0.7191123

使用此数据集:

set.seed(42)

df <- data.frame(

  A = runif(10),
  B = runif(10),
  C = sample(LETTERS[1:2],10,replace = T),
  D = sample(LETTERS[1:2],10,replace = T)
)

# > df
#    A         B         C D
# 1  0.9148060 0.4577418 B B
# 2  0.9370754 0.7191123 A B
# 3  0.2861395 0.9346722 B A
# 4  0.8304476 0.2554288 B B
# 5  0.6417455 0.4622928 A A
# 6  0.5190959 0.9400145 B B
# 7  0.7365883 0.9782264 A A
# 8  0.1346666 0.1174874 B A
# 9  0.6569923 0.4749971 A B
# 10 0.7050648 0.5603327 B B