如何添加一列来计算另一列的值

时间:2019-09-21 08:34:13

标签: r count na

到目前为止,我对R环境还不太熟悉,我在以下方面苦苦挣扎:

df <- tibble(x= c(1.12, 4.12,4.64, NA, NA, 0.72), 
             y= c(8.92, 14.9, 3.2, NA, NA, NA))

我想添加两个包含x / y案例数的新列。

我已经尝试过使用它给我号码,但是我不知道如何将其添加到df表中。

nr <- colSums(!is.na(df))

或者使用mutate()也许有一种更简单的方法吗?

非常感谢!

5 个答案:

答案 0 :(得分:2)

您需要这个吗?

df <- tibble(x= c(1.12, 4.12,4.64, NA, NA, 0.72), 
             y= c(8.92, 14.9, 3.2, NA, NA, NA))


df$xcases <- sum(!is.na(df$x))
df$ycases <- sum(!is.na(df$y))
df

      x     y xcases ycases
  <dbl> <dbl>  <int>  <int>
1  1.12  8.92      4      3
2  4.12 14.9       4      3
3  4.64  3.2       4      3
4 NA    NA         4      3
5 NA    NA         4      3
6  0.72 NA         4      3

答案 1 :(得分:1)

data.table选项:

library(data.table)
dt <- data.table(
  x= c(1.12, 4.12,4.64, NA, NA, 0.72), 
  y= c(8.92, 14.9, 3.2, NA, NA, NA)
)

dt[, x.cases := sum(!is.na(x))]
dt[, y.cases := sum(!is.na(y))]

# to apply same transformation to multiple colums:

cols <- c("x", "y")
out_cols = paste(cols, "cases", sep = ".")
dt[, c(out_cols) := lapply(.SD, function(x) sum(!is.na(x))), .SDcols = cols]

答案 2 :(得分:0)

如果要使用mutate进行操作,请尝试使用mutate_all变体:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

df <- tibble(x = c(1.12, 4.12,4.64, NA, NA, 0.72), 
             y = c(8.92, 14.9, 3.2, NA, NA, NA))

df %>%
  mutate_all(.funs = list(no_cases = ~ sum(!is.na(x = .))))
#> # A tibble: 6 x 4
#>       x     y x_no_cases y_no_cases
#>   <dbl> <dbl>      <int>      <int>
#> 1  1.12  8.92          4          3
#> 2  4.12 14.9           4          3
#> 3  4.64  3.2           4          3
#> 4 NA    NA             4          3
#> 5 NA    NA             4          3
#> 6  0.72 NA             4          3

希望这会有所帮助。

答案 3 :(得分:0)

您是否真的希望表中的信息作为新列?

这是使用已经计算的nr

的一种方法
df[paste0(names(df), "_case")] <- as.list(nr)
df
# A tibble: 6 x 4
#      x     y x_case y_case
#  <dbl> <dbl>  <dbl>  <dbl>
#1  1.12  8.92      4      3
#2  4.12 14.9       4      3
#3  4.64  3.2       4      3
#4 NA    NA         4      3
#5 NA    NA         4      3
#6  0.72 NA         4      3

或更普遍地

df[paste0(names(df), "_case")] <- as.list(colSums(!is.na(df)))

答案 4 :(得分:0)

使用tidyverse,一个选项是uncount,并使用现有数据集扩展已创建的vectorbind

library(dplyr)
library(tidyr)
library(stringr)
as.list(nr) %>% 
     as_tibble %>% 
     uncount(nrow(df)) %>% 
     rename_all(~ str_c(., '_case')) %>%
     bind_cols(df, .)
# A tibble: 6 x 4
#      x     y x_case y_case
#  <dbl> <dbl>  <dbl>  <dbl>
#1  1.12  8.92      4      3
#2  4.12 14.9       4      3
#3  4.64  3.2       4      3
#4 NA    NA         4      3
#5 NA    NA         4      3
#6  0.72 NA         4      3