合并两列(数值)并保留NA

时间:2018-01-22 22:18:41

标签: r

我希望合并两列。我通常会将两列相加。但是,在这种情况下,我需要保留原始的NA,并且只将数值从两列合二为一。我曾尝试使用ifelse语句,但由于我使用2x列,然后将两者结合起来对嵌套ifelse来说比较棘手。

以下是我的示例数据:

# Example

    data <- c(80,7.692307692,
              7.692307692
              ,8.333333333
              ,9.090909091
              ,20
              ,27.27272727
              ,50
              ,50
              ,21.42857143
              ,58.33333333
              ,46.66666667
              ,78.06451613
              ,186.15384615
              ,42.85714286
              ,44.1860465,
              20,
              25,
              40,45,78,55)
    df <- data.frame(data)
    df$long <- ifelse(df$data <20,1,0) # print 1s
    df$long_exit <- df$data <=70 # logical
    df$long_sigs <- ifelse(df$long_exit == FALSE,0,NA)  # convert FALSE to 1 and retain NAs

    desired_sum_output <- c(0,1,1,1,1,NA,NA,NA,NA,NA,NA,NA,0,0,NA,NA,NA,NA,NA,NA,0,NA)

    df <- data.frame(df,desired_sum_output)

    #sum df$long + df$long_sigs to and retain 0
    sums <- df$long + df$long_sigs # summing 

    > df
             data long long_exit long_sigs desired_sum_output
    1   80.000000    0     FALSE         0                  0
    2    7.692308    1      TRUE        NA                  1
    3    7.692308    1      TRUE        NA                  1
    4    8.333333    1      TRUE        NA                  1
    5    9.090909    1      TRUE        NA                  1
    6   20.000000    0      TRUE        NA                 NA
    7   27.272727    0      TRUE        NA                 NA
    8   50.000000    0      TRUE        NA                 NA
    9   50.000000    0      TRUE        NA                 NA
    10  21.428571    0      TRUE        NA                 NA
    11  58.333333    0      TRUE        NA                 NA
    12  46.666667    0      TRUE        NA                 NA
    13  78.064516    0     FALSE         0                  0
    14 186.153846    0     FALSE         0                  0
    15  42.857143    0      TRUE        NA                 NA
    16  44.186047    0      TRUE        NA                 NA
    17  20.000000    0      TRUE        NA                 NA
    18  25.000000    0      TRUE        NA                 NA
    19  40.000000    0      TRUE        NA                 NA
    20  45.000000    0      TRUE        NA                 NA
    21  78.000000    0     FALSE         0                  0
    22  55.000000    0      TRUE        NA                 NA

这通常是合理的:

df$z <- rowSums(df[, c("long", "long_sigs")], na.rm=TRUE) 

但是我失去了我的NA定位。

保留NA的原因是我将使用来自动物园的na.locf打包以转发填充NA值。

1 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望与na.rm = TRUE联系long = 1,否则保留NA。所以这应该创建z = desired_sum_output

df$z <- ifelse(df$long == 1, 
               rowSums(df[, c("long", "long_sigs")], na.rm=TRUE), 
               rowSums(df[, c("long", "long_sigs")]))