条件值过滤

时间:2018-10-05 12:57:03

标签: r dataframe dplyr data-manipulation

样本数据

library(dplyr)
df <- data.frame(
  ID = c(1,1,1,1,2,2,2,3,3,3),
  day = c(3,8,14,29,4,6,8,1,4,9),
  value = c(75, 101, 115, 120, 110, 106, 122, 100, 128, 140))

问题背后的想法:

为每个 ID 主题选择最小的 day ,并将 value 功能乘以1.3(ID 1-天3-值75,ID 2-第4天-值110,ID 3-第1天-值100)。 然后将新创建的与具有相同 ID 但具有不同 day 数字的其他

例如:

ID 1的最小 day 数是3。然后将该行的乘以1.3(75 * 1.3 = 97.5) 。将新创建的(97.5)与具有相同 ID 为1的((101、115、120))进行比较。然后如果新值大于((101、115、120)),则为TRUE或FALSE。

对于 ID 2和3重复同样的操作。

1 个答案:

答案 0 :(得分:0)

library(dplyr)

df <- data.frame(
  ID = c(1,1,1,1,2,2,2,3,3,3),
  day = c(3,8,14,29,4,6,8,1,4,9),
  value = c(75, 101, 115, 120, 110, 106, 122, 100, 128, 140))

df %>%
  group_by(ID) %>%
  mutate(v = value[day == min(day)] * 1.3,
         flag = value > v) %>%
  ungroup()

# # A tibble: 10 x 5
#      ID   day value     v flag 
#   <dbl> <dbl> <dbl> <dbl> <lgl>
# 1     1     3    75  97.5 FALSE
# 2     1     8   101  97.5 TRUE 
# 3     1    14   115  97.5 TRUE 
# 4     1    29   120  97.5 TRUE 
# 5     2     4   110 143   FALSE
# 6     2     6   106 143   FALSE
# 7     2     8   122 143   FALSE
# 8     3     1   100 130   FALSE
# 9     3     4   128 130   FALSE
#10     3     9   140 130   TRUE 

如果您想用至少一个ID TRUE标记flag,则可以这样创建flag2

 df %>%
  group_by(ID) %>%
  mutate(v = value[day == min(day)] * 1.3,
         flag = value > v,
         flag2 = max(flag)) %>%
  ungroup()

# # A tibble: 10 x 6
#      ID   day value     v flag  flag2
#   <dbl> <dbl> <dbl> <dbl> <lgl> <int>
# 1     1     3    75  97.5 FALSE     1
# 2     1     8   101  97.5 TRUE      1
# 3     1    14   115  97.5 TRUE      1
# 4     1    29   120  97.5 TRUE      1
# 5     2     4   110 143   FALSE     0
# 6     2     6   106 143   FALSE     0
# 7     2     8   122 143   FALSE     0
# 8     3     1   100 130   FALSE     1
# 9     3     4   128 130   FALSE     1
#10     3     9   140 130   TRUE      1

或提取ID作为向量:

df %>%
  group_by(ID) %>%
  mutate(v = value[day == min(day)] * 1.3,
         flag = value > v) %>%
  ungroup() -> df2

df2 %>% 
  filter(flag == TRUE) %>%
  distinct(ID) %>%
  pull(ID)

#[1] 1 3