簡體   English   中英

根據條件變異?

[英]Mutate based on conditions?

df <- data.frame(x1 = c("a","a","a","a","b","b","b","b"),ind = c("O","O","C","C","O","O","O","O"), num = c(6,12,18,24,6,12,18,24))
set.seed(1)
df <- df[sample(nrow(df)),]


df2 <- df %>% group_by(x1) %>%
  arrange(x1,num) 
> df2
# A tibble: 8 x 3
# Groups:   x1 [2]
  x1    ind     num
  <fct> <fct> <dbl>
1 a     O         6
2 a     O        12
3 a     C        18
4 a     C        24
5 b     O         6
6 b     O        12
7 b     O        18
8 b     O        24

我想為此數據創建一些新列,第一個應該檢查列x1的每個唯一值,它應該采用列ind等於C的列num的最小值。 對於值a這應該返回18 然后它再次執行此操作,但檢查ind何時等於O 如果它什么也沒找到,那么它應該只返回 N/A。 所以這兩列應該是這樣的結果:

  x1    ind     num min_O min_C
  <fct> <fct> <dbl> <dbl> <dbl>
1 a     O         6     6    18
2 a     O        12     6    18
3 a     C        18     6    18
4 a     C        24     6    18
5 b     O         6     6    NA
6 b     O        12     6    NA
7 b     O        18     6    NA
8 b     O        24     6    NA

我嘗試了按x1ind列進行分組的變體,但無法使其工作,因為如果它等於特定值,我想做一個最小值。 我相信有一個簡單的方法!

這看起來有點麻煩,但確實有效

library(dplyr)
library(tidyr)

df2 %>% 
 group_by(x1, ind) %>% 
 pivot_wider(names_from = ind, values_from = num, values_fn = min, names_prefix = 'min_') %>% 
 left_join(df2, by = 'x1')

# A tibble: 8 x 5
# Groups:   x1 [2]
  x1    min_O min_C ind     num
  <chr> <dbl> <dbl> <chr> <dbl>
1 a         6    18 O         6
2 a         6    18 O        12
3 a         6    18 C        18
4 a         6    18 C        24
5 b         6    NA O         6
6 b         6    NA O        12
7 b         6    NA O        18
8 b         6    NA O        24

另一種方式可能是

library(tidyr)
library(dplyr)
df %>%
  arrange(x1,num) %>% 
  group_by(x1) %>%
  mutate(min_C = min(num[ind == "C"]), 
         min_O = min(num[ind == "O"]),
         across(starts_with("min"), ~ ifelse(.x == Inf, NA_real_, .x)))

返回

# A tibble: 8 x 5
# Groups:   x1 [2]
  x1    ind     num min_C min_O
  <chr> <chr> <dbl> <dbl> <dbl>
1 a     O         6    18     6
2 a     O        12    18     6
3 a     C        18    18     6
4 a     C        24    18     6
5 b     O         6    NA     6
6 b     O        12    NA     6
7 b     O        18    NA     6
8 b     O        24    NA     6

但也會返回警告,因為b組中沒有C

如果您不使用across(...)部分,則NA將替換為Inf

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM