到目前为止,我对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()也许有一种更简单的方法吗?
非常感谢!
答案 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
,并使用现有数据集扩展已创建的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