簡體   English   中英

根據前綴有條件地改變 tibble

[英]Mutate tibble conditionally based on prefixes

我正在嘗試根據以下條件改變 tibble:

  • 對於每一行,如果僅包含前綴(即 a 或 b)的列的值為 1,則其他以相關前綴開頭的列也應重新編碼為 1
  • 但是,對於每一行,如果以前綴開頭的任何列的值為 1,則以該前綴開頭的所有行中的值都應保留
  • 僅使用前綴命名的列應在更改后刪除。

一個可重現的例子是:

tibble(a = c(1, 1, 0, 0, 1),
       a.1 = c(0, 0, 1, 0, 1),
       a.2 = c(0, 0, 0, 1, 0),
       b = c(0, 0, 0, 0, 1),
       b.1 = c(0, 0, 0, 1, 0),
       b.2 = c(0, 0, 0, 0, 0))

# A tibble: 5 × 6
      a   a.1   a.2     b   b.1   b.2
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     0     0     0     0     0
2     1     0     0     0     0     0
3     0     1     0     0     0     0
4     0     0     1     0     1     0
5     1     1     0     1     0     0

最終結果應如下所示:

tibble(
       a.1 = c(1, 0, 1, 0, 1),
       a.2 = c(1, 0, 0, 1, 0),
       b.1 = c(0, 0, 0, 1, 1),
       b.2 = c(0, 0, 0, 0,

 1))

# A tibble: 5 × 4
    a.1   a.2   b.1   b.2
  <dbl> <dbl> <dbl> <dbl>
1     1     1     0     0
2     0     0     0     0
3     1     0     0     0
4     0     1     1     0
5     1     0     1     1

我的真實數據中每個前綴都沒有固定數量的變量。 因此,我試圖寫一個通用的 function。

如果有人能幫助我,我將不勝感激:)

split.default + map_dfc的解決方案:

tbl %>% 
  split.default(gsub("\\..*", "", colnames(.))) %>% 
  map_dfc(~ {.x[.x[1] == 1 & rowSums(.x[-1]) == 0, ] <- 1
         .x[-1]})

output

# A tibble: 5 × 4
    a.1   a.2   b.1   b.2
  <dbl> <dbl> <dbl> <dbl>
1     1     1     0     0
2     1     1     0     0
3     1     0     0     0
4     0     1     1     0
5     1     0     1     1

暫無
暫無

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

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