R - как посчитать значения по столбцам и разделить на целые числа - PullRequest
1 голос
/ 07 июня 2019

У меня есть фрейм данных, в котором группы различаются по размерам, но я хочу суммировать по строкам и делить на n (количество имеющихся целых чисел) в новом столбце ( V1. значит )

Требуется, чтобы мы выбирали номера столбцов (в данном случае [10:18]), если только нет способа сделать это по имени. Если да, то научите меня во что бы то ни стало, потому что я должен преобразовать 8 вопросов (x9) следующим образом (см. Пример ниже).

Итак, я попробовал это:

df$v1.mean <- rowSums(cbind(df[10:18]), na.rm = T ) / # sums it up
              ncol(is.integer(cbind(df[10:18] )))     # sums integers, but no

Я видел этот пример dplyr, но я не уверен, как заставить его работать в tally ()

Фрейм данных выглядит следующим образом: V1.mean является решением, которое я ищу.

  V1.1 V1.2 V1.3 V1.4 V1.5 V1.6 V1.7 V1.8  V1.9 V2.1 | V1.mean V2.mean
1     5    4    5   NA   NA   NA   NA   NA   NA   5  | 4.67 [== (5+4+5)/3]
2     5    5    5   NA   NA   NA   NA   NA   NA   3
3     5    5    5    5   NA   NA   NA   NA   NA  ...
4     5    4    5   NA   NA   NA   NA   NA   NA  ...
5     5    5   NA   NA   NA   NA   NA   NA   NA  ...
6     5    5    5    5   NA   NA   NA   NA   NA  ...
7     5    5    5    4    4   NA   NA   NA   NA  ...
8     5    5    5    4    5    5   NA   NA   NA  ... | 4.83 [== (5+5+5+4+5+5)/6]
9     4    5    5    5    4   NA   NA   NA   NA  ...
10    5    5    5   NA   NA   NA   NA   NA   NA  ...

Заранее спасибо:)

Ответы [ 3 ]

1 голос
/ 08 июня 2019

Акрун дал правильный ответ, но для большинства анализов ваши данные не в самом простом формате.

Возможно, вы захотите рассмотреть вопрос о плавлении данных.

x = melt(as.matrix(df),varnames = c('row','col'))
x$id = substr(x$col,1,2)
ddply(x,c('row','id'),summarise,mean=mean(value,na.rm = T)) # or aggregate, etc.
1 голос
/ 12 июня 2019

Я думаю, что гораздо более простое решение - row_mean из hablar. Я повторно использую df от @ akrun.

library(hablar)

df1 %>% 
  mutate(v1.mean = row_mean_(contains("v1")))

, что дает вам:

   V1.1 V1.2 V1.3 V1.4 V1.5 V1.6 V1.7 V1.8 V1.9 V2.1  v1.mean
1     5    4    5   NA   NA   NA   NA   NA   NA    5 4.666667
2     5    5    5   NA   NA   NA   NA   NA   NA    3 5.000000
3     5    5    5    5   NA   NA   NA   NA   NA    4 5.000000
4     5    4    5   NA   NA   NA   NA   NA   NA    3 4.666667
5     5    5   NA   NA   NA   NA   NA   NA   NA    2 5.000000
6     5    5    5    5   NA   NA   NA   NA   NA    1 5.000000
7     5    5    5    4    4   NA   NA   NA   NA    5 4.600000
8     5    5    5    4    5    5   NA   NA   NA    4 4.833333
9     4    5    5    5    4   NA   NA   NA   NA    1 4.600000
10    5    5    5   NA   NA   NA   NA   NA   NA    5 5.000000
1 голос
/ 07 июня 2019

Вариант может быть split данных в list из data.frame с и получить rowMeans

nm1 <- sub("\\.\\d+$", "", names(df1))
df1[paste0(unique(nm1), ".mean")] <- sapply(split.default(df1,
       sub("\\.\\d+$", "", names(df1))), rowMeans, na.rm = TRUE)

df1
#   V1.1 V1.2 V1.3 V1.4 V1.5 V1.6 V1.7 V1.8 V1.9 V2.1  V1.mean V2.mean
#1     5    4    5   NA   NA   NA   NA   NA   NA    5 4.666667       5
#2     5    5    5   NA   NA   NA   NA   NA   NA    3 5.000000       3
#3     5    5    5    5   NA   NA   NA   NA   NA    4 5.000000       4
#4     5    4    5   NA   NA   NA   NA   NA   NA    3 4.666667       3
#5     5    5   NA   NA   NA   NA   NA   NA   NA    2 5.000000       2
#6     5    5    5    5   NA   NA   NA   NA   NA    1 5.000000       1
#7     5    5    5    4    4   NA   NA   NA   NA    5 4.600000       5
#8     5    5    5    4    5    5   NA   NA   NA    4 4.833333       4
#9     4    5    5    5    4   NA   NA   NA   NA    1 4.600000       1
#10    5    5    5   NA   NA   NA   NA   NA   NA    5 5.000000       5

или с использованием той же логики в цепочке приливов и отливов

library(tidyverse)
df1 %>%
   split.default(nm1) %>%
   map_dfc(rowMeans, na.rm = TRUE) %>%
   rename_all(~ str_c(., ".mean")) %>% 
   bind_cols(df1, .)

data

df1 <- structure(list(V1.1 = c(5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 4L, 5L
), V1.2 = c(4L, 5L, 5L, 4L, 5L, 5L, 5L, 5L, 5L, 5L), V1.3 = c(5L, 
5L, 5L, 5L, NA, 5L, 5L, 5L, 5L, 5L), V1.4 = c(NA, NA, 5L, NA, 
NA, 5L, 4L, 4L, 5L, NA), V1.5 = c(NA, NA, NA, NA, NA, NA, 4L, 
5L, 4L, NA), V1.6 = c(NA, NA, NA, NA, NA, NA, NA, 5L, NA, NA), 
    V1.7 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), V1.8 = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA), V1.9 = c(NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA), V2.1 = c(5L, 3L, 4L, 3L, 2L, 
    1L, 5L, 4L, 1L, 5L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))
...