[英]Assign row values of a column based on conditional values of that column in R
我有一個數據框,其中類別名稱及其標簽位於同一列中。 類別名稱全部大寫,標簽僅首字母大寫。
可以以最簡單的形式創建示例數據框:
xdata <- tibble(category_and_label=c('CATEGORY1','Name1','Name2','Name3','CATEGORY2','Name1','Name2','Name4'),
values =c(NA, 2,3,4,NA,5,6,7))
它看起來像
category_and_label values
<chr> <dbl>
1 CATEGORY1 NA
2 Name1 2
3 Name2 3
4 Name3 4
5 CATEGORY2 NA
6 Name1 5
7 Name2 6
8 Name4 7
我需要將類別名稱和標簽放在單獨的列中。 正確修改的df是:
category label values
<chr> <chr> <dbl>
1 CATEGORY1 Name1 2
2 CATEGORY1 Name2 3
3 CATEGORY1 Name3 4
4 CATEGORY2 Name1 5
5 CATEGORY2 Name2 6
6 CATEGORY2 Name4 7
我只能設想解決方案的第一部分。 創建一個列來標記類別名稱對我來說很有意義。
xdata <- xdata %>% mutate(allcaps=if_else(str_detect(category_and_label,'[A-Z]{3,}'),1,0))
category_and_label values allcaps
<chr> <dbl> <dbl>
1 CATEGORY1 NA 1
2 Name1 2 0
3 Name2 3 0
4 Name3 4 0
5 CATEGORY2 NA 1
6 Name1 5 0
7 Name2 6 0
8 Name4 7 0
這標識了類別名稱。 使用 dplyr,我將如何將標識的類別名稱分配給行值等於類別名稱的新列,但直到滿足下一個類別名稱。
我嘗試了一些想法,但沒有一個值得展示。
一旦類別和名稱分開,我就可以使用 rename() 重命名列。
一種方法是cumsum()
一個布爾變量。 在您的示例中,每個類別的第一行都有values
= NA
; 如果這普遍適用,那么以下代碼可能是您想要的:
xdata %>%
mutate(
category = cumsum(is.na(values))
) %>%
filter(!is.na(values)) %>%
rename(label = category_and_label)
產量
# A tibble: 6 × 3
label values category
<chr> <dbl> <int>
1 Name1 2 1
2 Name2 3 1
3 Name3 4 1
4 Name1 5 2
5 Name2 6 2
6 Name4 7 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.