【问题标题】:Creating a new column based on specific rows in already existing column with case_when and ifelse condition使用 case_when 和 ifelse 条件根据现有列中的特定行创建新列
【发布时间】:2021-07-11 02:11:10
【问题描述】:

我一直在努力寻找一种方法来根据特定条件将某些行的值重新打印到新列中。我有一个如下所示的数据框:

Name    V1  V2   V3 
name1   a   a1  yes     
name2   b   b1  yes
name3   c   c1  no
name3   d   d1  yes 

如果 V3 为“是”,我想使用 case_when 或 ifelse 创建一个新列以重新打印第二列中的内容,如果 V3 为“否”,则添加第一列和第二列。看起来像这样:

Name    V1  V2   V3 V4
name1   a   a1  yes a1  
name2   b   b1  yes a1
name3   c   c1  no  c+c1
name3   d   d1  yes d1

但是,我遇到的一个问题是,我的价值观并非全是逻辑或全是字符,而是两者的混合。 V3 是字符,V2 是时间戳,V1 是秒时间。我将不胜感激任何帮助。谢谢。

【问题讨论】:

    标签: r if-statement case-when


    【解决方案1】:

    我们可以在base R 中使用ifelsetransform

    df1 <- transform(df1, V4 = ifelse(V3 == "no", paste0(V1, "+", V2), V2))
    

    如果这些不是字符串,则使用V1 + V2 并删除paste0

    -输出

    df1
      Name V1 V2  V3   V4
    1 name1  a a1 yes   a1
    2 name2  b b1 yes   b1
    3 name3  c c1  no c+c1
    4 name3  d d1 yes   d1
    

    注意:如果列 'V2'、'V1' 属于不同的类,请在执行 ifelse 之前将两者都转换为 character

    df1[c("V1", "V2")] <- lapply(df1[c("V1", "V2")], as.character)
    

    或者使用dplyr

    library(dplyr)
    library(stringr)
    df1 %>%
        mutate(V4 = case_when(V3 == "no" ~ str_c(V1, "+", V2), TRUE ~ V2))
    

    数据

    df1 <- structure(list(Name = c("name1", "name2", "name3", "name3"), 
        V1 = c("a", "b", "c", "d"), V2 = c("a1", "b1", "c1", "d1"
        ), V3 = c("yes", "yes", "no", "yes")), 
    class = "data.frame", row.names = c(NA, 
    -4L))
    

    【讨论】:

    • @GenLG 然后你使用V1 + V2 而不是paste
    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    相关资源
    最近更新 更多