Как рассчитать среднее и стандартное отклонение на основе процента - PullRequest
0 голосов
/ 13 февраля 2020

Вот мои данные:

df1 <- read.table(text = " Group L1 L2 L3 L4 l5
Q 0% 10% 0% 70% 20%
K 20% 20% 20% 10% 30%", header = TRUE)

Я хочу рассчитать L1 раз 1, L2 раз 2, L3 раз 3, L4 раз 4 и L5 раз 5 для Q и k.

Я хочу получить следующую таблицу:

Group  L1  L2  L3  L4  l5 Mean   SD
    Q  0% 10%  0% 70% 20%  0.8 1.19
    K 20% 20% 20% 10% 30% 0.62 0.51

Примечание: у меня есть 100 строк, и это часть моего примера, чтобы показать цель моего вопроса. Очень признателен за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Мы могли бы сначала удалить знак "%" из столбцов. Умножьте df1 на 1:5 и вычислите среднее значение по строкам и сд.

df1[-1] <- lapply(df1[-1], function(x) as.numeric(sub('%', '', x)))
temp <- as.matrix(sweep(df1[-1], 2, seq_along(df1[-1]), `*`))
df1$Mean <- rowMeans(temp)/100
df1$Sds <- matrixStats::rowSds(temp)/100
#Or to keep it in base R
#df1$Sds <- apply(temp, 1, sd)/100
df1

#  Group L1 L2 L3 L4 l5 Mean     Sds
#1     Q  0 10  0 70 20 0.80 1.19164
#2     K 20 20 20 10 30 0.62 0.51186

данные

df1 <- structure(list(Group = structure(2:1, .Label = c("K", "Q"),class = "factor"),
L1 = structure(1:2, .Label = c("0%", "20%"), class = "factor"), 
L2 = structure(1:2, .Label = c("10%", "20%"), class = "factor"), 
L3 = structure(1:2, .Label = c("0%", "20%"), class = "factor"), 
L4 = structure(2:1, .Label = c("10%", "70%"), class = "factor"), 
l5 = structure(1:2, .Label = c("20%", "30%"), class = "factor")), 
class = "data.frame", row.names = c(NA, -2L))
1 голос
/ 13 февраля 2020
library(tidyverse)

df %>%
  mutate(id = row_number()) %>%
  pivot_longer(L1:L5) %>%
  mutate(value = as.numeric(sub("%", "", value))/100 * 1:5) %>%
  group_by(id) %>%
  summarise(Mean = mean(value), SD = sd(value)) %>%
  bind_cols(df, .)

#   Group  L1  L2  L3  L4  L5 id Mean        SD
# 1     Q  0% 10%  0% 70% 20%  1 0.80 1.1916375
# 2     K 20% 20% 20% 10% 30%  2 0.62 0.5118594

Данные

df <- structure(list(Group = structure(2:1, .Label = c("K", "Q"), class = "factor"), 
  L1 = structure(1:2, .Label = c("0%", "20%"), class = "factor"), 
  L2 = structure(1:2, .Label = c("10%", "20%"), class = "factor"), 
  L3 = structure(1:2, .Label = c("0%", "20%"), class = "factor"), 
  L4 = structure(2:1, .Label = c("10%", "70%"), class = "factor"), 
  L5 = structure(1:2, .Label = c("20%", "30%"), class = "factor")),
class = "data.frame", row.names = c(NA, -2L))
...