【问题标题】:Replace value in data.frame with value in next column用下一列中的值替换 data.frame 中的值
【发布时间】:2016-08-22 15:01:16
【问题描述】:

我有两列的数据框:

   names duration
1      J       97
2      G       NA
3      H       53
4      A       23
5      E       NA
6      D       NA
7      C       73
8      F       NA
9      B       37
10     I       67

我想要做的是将持续时间列中的所有 NA 值替换为同一行中名称列中的值。我怎样才能做到这一点?

【问题讨论】:

    标签: r rscript


    【解决方案1】:

    数据

    zz <- "names duration
    1      J       97
    2      G       NA
    3      H       53
    4      A       23
    5      E       NA
    6      D       NA
    7      C       73
    8      F       NA
    9      B       37
    10     I       67"
    
    df <- read.table(text = zz, header = TRUE)
    

    dplyr的解决方案

    library(dplyr)
    
    df_new <- df %>% 
        mutate(duration = ifelse(is.na(duration), as.character(names), duration))
    

    输出

        df_new
        #    names duration
        # 1      J       97
        # 2      G        G
        # 3      H       53
        # 4      A       23
        # 5      E        E
        # 6      D        D
        # 7      C       73
        # 8      F        F
        # 9      B       37
        # 10     I       67
    

    【讨论】:

    • 感谢这对我非常有用。我只需要添加一行代码即可将数字的持续时间列中的所有点替换为逗号。
    【解决方案2】:

    我们可以使用is.na 创建一个逻辑索引,然后根据“i1”对两个“名称”进行子集化,以替换同一行上的“持续时间”。

    i1 <- is.na(df$duration)
    df$duration[i1] <- df$names[i1]
    df
    #   names duration
    #1      J       97
    #2      G        G
    #3      H       53
    #4      A       23
    #5      E        E
    #6      D        D
    #7      C       73
    #8      F        F
    #9      B       37
    #10     I       67
    

    注意:这应该将“持续时间”的 classnumeric 更改为 character


    或者这可以通过data.table 更快的方法来完成。将'data.frame'转换为'data.table'(setDT(df)),将'duration'的class更改为character,然后通过在'i'(is.na(duration))中指定条件,我们分配(:=) 'name' 中对应于 'i' 条件到 'duration' 的值。由于分配到位,它将非常有效。

    library(data.table)
    setDT(df)[, duration:= as.character(duration)][is.na(duration), duration:= names]
    

    数据

    df <- structure(list(names = c("J", "G", "H", "A", "E", "D", "C", "F", 
    "B", "I"), duration = c(97L, NA, 53L, 23L, NA, NA, 73L, NA, 37L, 
    67L)), .Names = c("names", "duration"), row.names = c("1", "2", 
    "3", "4", "5", "6", "7", "8", "9", "10"), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多