Как сделать условное вычисление rowMeans в R? - PullRequest
0 голосов
/ 04 декабря 2018

Я хотел бы вычислить rowMeans для нескольких переменных, но только , если присутствует не менее 80% данных.В первом примере среднее значение должно быть вычислено только для первой строки.Во втором случае никакие средства не должны быть рассчитаны.Как мне это сделать?

x <- c(1, 2)
y <- c(1, 2)
z <- c(1, NA)
z1 <- c(1, NA)
z2 <- c(1, NA)
df <- data.frame(x, y, z, z1, z2)
df$means <- rowMeans(df)
df

  x y  z z1 z2 means
1 1 1  1  1  1     1
2 2 2 NA NA NA    NA

x <- c(1, 2)
y <- c(1, 2)
z <- c(1, 2)
z1 <- c(1, 2)
z2 <- c(1, NA)
df <- data.frame(x, y, z, z1, z2)
df$means <- rowMeans(df)
df

   x  y   z z1 z2    means
1  1  1   1  1  1      1
2  2  2   2  2  NA     2

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Еще один полностью векторизованный подход, где мы сначала вычисляем средние значения для всех строк.

df1$means <- rowMeans(df1, na.rm = TRUE)

Теперь мы заменим это значение на NA, если в строке менее 80% * NA с.

old_cols <- setdiff(names(df1), "means")
NA_rows <- 1 - rowMeans(is.na(df1[, old_cols])) < 0.8
df1[NA_rows, "means"] <- NA
df1
#  x y  z z1 z2 means
#1 1 1  1  1  1     1
#2 2 2 NA NA NA    NA

data

df1 <- structure(list(x = c(1, 2), y = c(1, 2), z = c(1, NA), z1 = c(1, 
NA), z2 = c(1, NA)), .Names = c("x", "y", "z", "z1", "z2"), row.names = c(NA, 
-2L), class = "data.frame")
0 голосов
/ 04 декабря 2018

Возможно, что-то вроде этого?

transform(df, means = apply(df, 1, function(x)
    ifelse(sum(is.na(x)) / length(x) < 0.2, mean(x, na.rm = T), NA)))
#  x y  z z1 z2 means
#1 1 1  1  1  1     1
#2 2 2 NA NA NA    NA

Объяснение: Мы рассчитываем долю NA с на строку и возвращаем среднее значение строки, только если эта доля меньше 0,2 (т.е. строка содержит по крайней мере80% (не NA значения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...