Как добавить столбец, который считает значения другого столбца - PullRequest
1 голос
/ 21 сентября 2019

Я не очень знаком с 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))

Я хотел бы добавить два новых столбца, которые содержат числослучаи х / у.

Я уже пробовал это, которое дает мне номер, но я не знаю, как добавить это в df-таблицу.

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

Или есть ли более простой способ с помощью mutate ()?

Большое спасибо!

Ответы [ 5 ]

2 голосов
/ 21 сентября 2019

Вам это нужно?

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 голос
/ 21 сентября 2019

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]
0 голосов
/ 21 сентября 2019

При tidyverse одним из вариантов будет uncount и расширение уже созданных vector и bind существующим набором данных

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
0 голосов
/ 21 сентября 2019

Вы действительно хотите эту информацию в таблице как новый столбец?

Вот один из способов использования уже рассчитанного 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)))
0 голосов
/ 21 сентября 2019

Если вы хотите сделать это с помощью 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

Надеюсь, это поможет.

...