将 data.frame 中的值替换为下一列中的值

Replace value in data.frame with value in next column

我有两列数据框:

   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 值替换为同一行中名称列中的值。我怎样才能做到这一点?

我们可以使用 is.na 创建一个逻辑索引,然后在 'i1' 的基础上对 'names' 进行子集替换同一行上的 'duration'。

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

注意:这应该将 'duration' 的 classnumeric

更改为 character

或者这可以通过 data.table 更快的方法来完成。将'data.frame'转换为'data.table'(setDT(df)),将'duration'的class转换为character,然后通过在[=39中指定条件=](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")

数据

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