【问题标题】:Adding values to one columns based on conditions根据条件向一列添加值
【发布时间】:2023-03-30 07:22:01
【问题描述】:

我想根据两列更新一列

我的示例数据框包含 3 列

df <- data.frame(n1 = c(1,2,1,2,5,6),
                 n2 = c("a", "a", "a", NA, "b", "c"),
                 n3 = c("red", "red", NA, NA, NA, NA))

df

  n1   n2   n3
1  1    a  red
2  2    a  red
3  1    a <NA>
4  2 <NA> <NA>
5  5    b <NA>
6  6    c <NA>

我想将red 名称添加到行号34,条件是如果n1(即1,2)的值与n2(即a)匹配,即使第四行(n1 不匹配 n2)。

重点是如果n2 == a,并且n1的值与a相关联,那么n3的值与n1的值在同一行应该加上red.

我想要的输出

  n1   n2   n3
1  1    a  red
2  2    a  red
3  1    a  red
4  2 <NA>  red
5  5    b <NA>
6  6    c <NA>

对这个案例有什么建议吗?我希望我的解释足够清楚。由于我的数据很长,我正在努力寻找一个好的来处理它。

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    base R 中,根据'n1' 的unique 值(其中'n2' 是“a”)创建一个逻辑向量以子集'df' 的行,然后分配'n3' 对应于具有来自 'n3' 的第一个非 NA 元素的元素

    i1 <- with(df, n1 %in% unique(n1[n2 %in% 'a']))
    df$n3[i1] <- na.omit(df$n3[i1])[1]
    

    -输出

    > df
      n1   n2   n3
    1  1    a  red
    2  2    a  red
    3  1    a  red
    4  2 <NA>  red
    5  5    b <NA>
    6  6    c <NA>
    

    【讨论】:

    • 到目前为止,这是一个很好的条件,但我刚刚发现了另一种可能用于这种情况的条件,因为应用于我的数据的代码不知何故只添加了大约 70% 的单元格 red跨度>
    • @Anh 我猜您的原始数据在逻辑向量i1 中可能存在一些问题。在这里,它是通过检查“n1”值中哪些“n2”值为“a”来创建的。是否还有其他事情发生,即在您的数据等中有"NA" 而不是NA?如果这些缺失值不是NA,那么na.omit 将不会删除它们。不清楚没有显示问题的可重现的小例子
    • 我已经找到问题了,我要创建一个新帖子
    【解决方案2】:

    更新:

    df %>% 
      mutate(group = rep(row_number(), each=2, length.out = n())) %>% 
      group_by(group) %>% 
      mutate(n3 = ifelse(n1 %in% c(1,2) & any(n2 %in% "a", na.rm = TRUE), "red", n3)) %>% 
      ungroup() %>% 
      select(-group)
    

    我们可以使用ifelse 语句和使用any 定义的条件。

    library(dplyr)
    df %>% 
      mutate(n3 = ifelse(n1==1 | n1==2 & any(n2[3:4] %in% "a"), "red", n3))
    
      n1   n2   n3
    1  1    a  red
    2  2    a  red
    3  1    a  red
    4  2 <NA>  red
    5  5    b <NA>
    6  6    c <NA>
    

    【讨论】:

    • 因为我有这么多号码,还有其他方法不用打电话给12
    • 请看我的更新!
    • 非常感谢啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊刚刚发现我的案子有问题我想发个新帖子啊。
    【解决方案3】:
    library(dplyr)
    library(tidyr)
    
    df %>% 
      group_by(n1) %>%
      fill(n3) %>%
      group_by(n2) %>%
      fill(n3)
    # # A tibble: 6 × 3
    # # Groups:   n2 [4]
    #      n1 n2    n3   
    #   <dbl> <chr> <chr>
    # 1     1 a     red  
    # 2     2 a     red  
    # 3     1 a     red  
    # 4     2 NA    red  
    # 5     5 b     NA   
    # 6     6 c     NA   
    

    【讨论】:

    • 不知何故,当我尝试它时,red 名称也添加到了我不想要的地方
    • 不过非常感谢#
    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多