簡體   English   中英

根據 R 中該列的條件值分配該列的行值

[英]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.

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