【问题标题】:recode using ifelse clause within groups在组内使用 ifelse 子句重新编码
【发布时间】:2019-06-15 03:31:39
【问题描述】:

我正在尝试设置列(称为“组合”)以指示每个组(组)内所有者和负责人的组合信息。每个组中只有一个所有者,'Head' 基本上是每个组中具有最小 id 值的第一行。 如果 ID 被标记为所有者,则此组合列应标记为“1”,那么无论“头”中的信息如何,每个组中的其余 id 都将为 0。但是对于 ID 中没有任何 Owner 的组(即组内 owner 中的所有 0),则此列将采用 Head 列信息。我的数据看起来像这样,最后一列(合并)是预期的结果。

sample <- data.frame(Group = c("46005589", "46005589","46005590","46005591", "46005591","46005592","46005592","46005592", "46005593", "46005594"), ID= c("189199", "2957073", "272448", "1872092", "10374996", "1153514", "2771118","10281300", "2610301", "3564526"), Owner = c(0, 1, 1, 0, 0, 0, 1, 0, 1, 1), Head = c(1, 0, 0, 1, 0, 1, 0, 0, 1, 1), combined = c(0, 1, 1, 1, 0, 0, 1, 0, 1, 1))

    > sample
      Group       ID Owner Head combined
1  46005589   189199     0    1        0
2  46005589  2957073     1    0        1
3  46005590   272448     1    0        1
4  46005591  1872092     0    1        1
5  46005591 10374996     0    0        0
6  46005592  1153514     0    1        0
7  46005592  2771118     1    0        1
8  46005592 10281300     0    0        0
9  46005593  2610301     1    1        1
10 46005594  3564526     1    1        1

我已经尝试了一些 dplyr 和 ifelse 子句,但它似乎没有给出我想要的输出。我应该如何重新编码这个专栏?谢谢。

【问题讨论】:

    标签: r if-statement group-by dplyr


    【解决方案1】:

    在dplyr中可以分两步创建新的合并列:首先使用filter(all(Owner == 0))通过创建一个只包含'Head'信息的列而不包含任何'Owner'的ID,然后将该列合并回原始数据框,将此列中的1与'Owner'列中的1相加得到组合信息。

        library(dplyr)
        sample2 <- sample %>%
                   group_by(Group) %>%
                   filter(all(Owner == 0)) %>%
                   mutate(Head_nullowner = ifelse(Head == 1, 1, 0))     #select all rows of IDs that do not have any owners
    
    #merge Head_nullowner with the original dataframe by both Group and ID
    sample <- merge(sample, sample2[c("Group", "ID", "Head_nullowner")], by.x = c("Group", "ID"), by.y = c("Group", "ID"), all.x = T)
    sample$Head_nullowner[is.na(sample$Head_nullowner)] <- 0
    sample$OwnerHead_combined = sample$Owner + sample$Head_nullowner
    
    
    
    
    > sample
          Group       ID Owner Head combined Head_nullowner OwnerHead_combined
    1  46005589   189199     0    1        0              0                  0
    2  46005589  2957073     1    0        1              0                  1
    3  46005590   272448     1    0        1              0                  1
    4  46005591 10374996     0    0        0              0                  0
    5  46005591  1872092     0    1        1              1                  1
    6  46005592 10281300     0    0        0              0                  0
    7  46005592  1153514     0    1        0              0                  0
    8  46005592  2771118     1    0        1              0                  1
    9  46005593  2610301     1    1        1              0                  1
    10 46005594  3564526     1    1        1              0                  1
    

    【讨论】:

      【解决方案2】:

      我认为这不是最好的方法,但您可能会查看目视检查全 0 的 ID。您可以使用rowSums 执行此操作,并使用%in% 指定这些ID。这是一个可能的解决方案:

      library(dplyr)
          df %>% 
        mutate_at(vars(ID,Group),funs(as.factor)) %>% 
        mutate(Combined=if_else(Owner==1,1,0),
               NewCombi=ifelse(ID== "1872092",Head,Combined))
      

      这产生:NewCombi 是我们的目标。

      #      Group       ID Owner Head Combined NewCombi
      #1  46005589   189199     0    1        0        0
      #2  46005589  2957073     1    0        1        1
      #3  46005590   272448     1    0        1        1
      #4  46005591  1872092     0    1        0        1
      #5  46005591 10374996     0    0        0        0
      #6  46005592  1153514     0    1        0        0
      #7  46005592  2771118     1    0        1        1
      #8  46005592 10281300     0    0        0        0
      #9  46005593  2610301     1    1        1        1
      #10 46005594  3564526     1    1        1        1
      

      【讨论】:

      • 嗨@NelsonGon,我同意这可能不是我想采用的方法,尤其是我有一个庞大的数据集,这使得我不可能通过所有的ID。感谢您花时间回答我的问题!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2020-05-31
      • 2023-03-24
      • 2020-10-27
      • 1970-01-01
      • 2015-10-03
      相关资源
      最近更新 更多