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

时间:2016-08-22 15:01:17

标签: r rscript

我的数据框有两列:

   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

我想要做的是将duration列中的所有NA值替换为同一行中names列的值。我该如何实现呢?

2 个答案:

答案 0 :(得分:4)

数据

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

答案 1 :(得分:1)

我们可以使用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

注意:这应该将class的{​​{1}}从character更改为numeric

或者可以使用data.table更快的方法来完成此操作。将'data.frame'转换为'data.table'(setDT(df)),将'duration'的class更改为character,然后在'i'中指定条件({ {1}}),我们将('is.na(duration))'name'中与'i'条件对应的值分配给'duration'。随着任务的到位,它将非常有效。

:=

数据

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