对于列A
,B
,C
和D
的数据框,我想要提取B
其中{的值{1}}最接近例如1 A
为C
,string1
为D
。
我试图使用管道运算符string2
来实现
%>%
哪个不起作用。有什么想法吗?
答案 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