как я могу получить медиану и sd для каждого столбца?

#r

#r

Вопрос:

У меня есть такие данные

 df<- structure(list(Mydata = c("AAA_F1", "AAA_F2", "AAA_F3"), F1_100 = c(0, 
7611.5, 12257.1), F2_100 = c(0L, 0L, 0L), F3_100 = c(200, 1967.7, 
400), F1_200M = c(0, 8155.4, 0), F2_200M = c(100, 500, 2490.1
), F3_200M = c(0, 2395.3, 0)), class = "data.frame", row.names = c(NA, 
-3L))
 

Я пытаюсь получить медиану и sd в виде двух фреймов данных, я делаю следующее, но я не получаю то, что хочу, поэтому первая строка должна дать мне медиану для каждых 3 значений из каждого столбца
, а вторая должна дать стандартное отклонение для каждых трех значений каждого столбца. Я думал, что должен сгруппировать их по именованию

 df_median <- as.data.frame(df %>% group_by(Mydata) %>% summarise_all(funs(median)))
df_sd <- as.data.frame(df %>% group_by(Mydata) %>% summarise_all(funs(sd)))
 

Вывод должен выглядеть так, например, для медианы (я использовал xls)

 Mydata  F1_100  F2_100  F3_100  F1_200M F2_200M F3_200M
AAA     7611.5.     0     400      0       500    0
 

Ответ №1:

Вы можете использовать across для применения нескольких функций к нескольким столбцам.

 library(dplyr)
result <- df %>% summarise(across(c(F1_100:F3_200M), list(median = median, sd = sd)))
 

Комментарии:

1. Я привел пример выше, они должны быть разделены

2. Вы хотите применить функции отдельно? df1 <- df %>% summarise(across(c(F1_100:F3_200M), median)) и df2 <- df %>% summarise(across(c(F1_100:F3_200M), sd))

3. Я получаю сообщение об ошибке, потому что я удалил символы как имена столбцов, есть идеи? Мне нравится ваше решение, но оно все еще не работает

4. Извините, я не понимаю. Что вы имеете в виду? Отличаются ли ваши данные от тех, которыми вы поделились?

Ответ №2:

Вы можете использовать sapply в базе R:

 sapply(df[-1], median)
#R>  F1_100  F2_100  F3_100 F1_200M F2_200M F3_200M 
#R>  7611.5     0.0   400.0     0.0   500.0     0.0 
sapply(df[-1], sd)
#R>   F1_100   F2_100   F3_100  F1_200M  F2_200M  F3_200M 
#R> 6188.067    0.000  968.026 4708.522 1280.174 1382.927 
 

Вы можете использовать lapply вместо, за которым следует, as.data.frame если хотите data.frame .

Комментарии:

1. он добавляет X в имя столбца

2. При запуске этого не as.data.frame(lapply(df[-1], median)) происходит.