簡體   English   中英

根據列名中的條件組合列集的 Tidyverse 方法

[英]Tidyverse method for combining sets of columns based on a condition in the column names

假設我的 dataframe 中有以下列(以及其他列)(感謝 Allan 創建示例數據):

20L, 15L), b_years = c(4L, 5L, 3L), b_months = 0:2, b_days = c(10L, 
8L, 6L), c_years = 8:6, c_months = c(11L, 9L, 8L), c_days = c(26L, 
19L, 18L)), class = "data.frame", row.names = c(NA, -3L))

df
#>   a_years a_months a_days b_years b_months b_days c_years c_months c_days
#> 1       5        6     23       4        0     10       8       11     26
#> 2       4        7     20       5        1      8       7        9     19
#> 3       3        8     15       3        2      6       6        8     18

我想組合以相同分組鍵開頭的列(在本例中是開頭的字母,但在我的數據中它是一個更長的表達式),這樣我就可以得到a_days, b_days, c_days等列,其中的值在 eahc 列中等於x_years * 365 + x_months * 30 + x_days ,對於每組( a, b, c, d, e等)列。

有沒有辦法一次性完成這一切? 想到了map()mutate()的某種組合,或者可能使用case_when() ,但我不太明白。 感謝您提供的任何指導!

你可以across內部transmute來做到這一點:

library(dplyr)


df %>% 
  transmute(across(contains("days"),   ~ .x)      +
            across(contains("months"), ~ .x * 30) +
            across(contains("years"),   ~ .x * 365)) 
#>   a_days b_days c_days
#> 1   2028   1470   3276
#> 2   1690   1863   2844
#> 3   1350   1161   2448

樣本數據

df <- structure(list(a_years = 5:3, a_months = 6:8, a_days = c(23L, 
20L, 15L), b_years = c(4L, 5L, 3L), b_months = 0:2, b_days = c(10L, 
8L, 6L), c_years = 8:6, c_months = c(11L, 9L, 8L), c_days = c(26L, 
19L, 18L)), class = "data.frame", row.names = c(NA, -3L))

df
#>   a_years a_months a_days b_years b_months b_days c_years c_months c_days
#> 1       5        6     23       4        0     10       8       11     26
#> 2       4        7     20       5        1      8       7        9     19
#> 3       3        8     15       3        2      6       6        8     18

創建於 2022-09-29,使用reprex v2.0.2

暫無
暫無

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

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