Применение одной и той же функции, но разных вычислений к разным спискам с двоичными столбцами в цикле с lapply - PullRequest
0 голосов
/ 19 апреля 2019

Название может сбивать с толку, но, думаю, у него есть простое решение.У меня есть собственная функция, и я хочу применить одну и ту же функцию к нескольким спискам, состоящим из двух столбцов.Но мне нужно делать разные вычисления для каждого столбца в отдельности.

В качестве примера mydata это:

    x1   x2   y1   y2   z1  z2
1  0.0  0.0  0.0  7.8  0.0 8.6
2  8.6  0.0  0.0  7.6  1.6 1.4
3 11.2  7.8  3.4  1.2  7.6 0.0
4  8.4  7.6 21.4 10.2 23.6 0.0
5  0.0  1.2  1.8  7.0  3.2 0.0
6  0.0 10.2  1.4  0.0  0.0 0.0

mydata<-structure(list(x1 = c(0, 8.6, 11.2, 8.4, 0, 0), x2 = c(0, 0, 
7.8, 7.6, 1.2, 10.2), y1 = c(0, 0, 3.4, 21.4, 1.8, 1.4), y2 = c(7.8, 
7.6, 1.2, 10.2, 7, 0), z1 = c(0, 1.6, 7.6, 23.6, 3.2, 0), z2 = c(8.6, 
1.4, 0, 0, 0, 0)), .Names = c("x1", "x2", "y1", "y2", "z1", "z2"
), class = "data.frame", row.names = c(NA, -6L))

И myfun функция:

        myfun<- function(x) {
  means<-sapply(list(x), function(ss) mean(ss, na.rm = T))
  #my point: vars<-sapply(list(y), function(ss) var(ss, na.rm = T))
  mean<-means[[1]]
  #var<-vars[[1]]
  #lists<-list(mean, var)
  #names(lists) <- c("mean", "var")
  #return(lists)
  lists<-list(mean)    
  names(lists)<-c("mean")
  return(lists)
}

Я использовал # для деталей, которые будут добавлены позже в myfun.

Когда я пытался

results<-lapply(mydata, myfun)

, я могу применить одну и ту же функцию и одинаковые вычисления к каждому столбцу.

Как видите, есть 2 столбца (x1-x2, y1-y2, z1-z2) за каждые данные (x, y, z).

То, что я хочу:

1) Получение means первых столбцов (x1, y1, z1)

2) Получение variances вторых столбцов(x2, y2, z2)

3) И как выходной;Я хочу видеть результаты mean1 и var1 для всех данных в списках x, y и z, таких как:

x-> mean1 (mean of x1)
    var1  (var of x2)

y-> mean1 (mean of y1)
    var1  (var of y2)

4) Делать все это в цикле с lapply или sapply или с любой полезной функцией.

Примечания:

1) Я не группировал x1 и x2 под x, y1 и y2 под y.Потому что, если можно найти решение для формы mydata, это было бы более полезным для меня.Но если это необходимо, я могу сгруппировать их отдельно.

2) myfun функция теперь ищет средства из 6 столбцов.Я указал дополнительные части, которые будут использоваться для расчета дисперсии вторых столбцов с #

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Подумайте сначала о назначении групп, затем повторите это с lapply. На самом деле используйте sapply с simplify=FALSE для именованного списка.

grps <- unique(gsub("[0-9]", "", colnames(mydata)))
# [1] "x" "y" "z"

myfun <- function(grp)
             list(mean = mean(mydata[,paste0(grp, 1)]),
                  variance = var(mydata[,paste0(grp, 2)]))  

mean_var_list <- sapply(grps, myfun, simplify = FALSE)    

mean_var_list
# $x
# $x$mean
# [1] 4.7
# 
# $x$variance
# [1] 20.87467
# 
# $y
# $y$mean
# [1] 4.666667
# 
# $y$variance
# [1] 16.53467
# 
# $z
# $z$mean
# [1] 6
# 
# $z$variance
# [1] 11.85067

Или используйте значение по умолчанию simplify=TRUE и верните матрицу.

mean_var_mat <- sapply(grps, myfun)

mean_var_mat
#          x        y        z       
# mean     4.7      4.666667 6       
# variance 20.87467 16.53467 11.85067
1 голос
/ 19 апреля 2019

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

library(purrr)

my_data_l <- split.default(mydata, rep(1:3, each = 2))

mean_var <- function(x) {
    list(mean = mean(x[,1]), var = var(x[,2]))
}

map_dfr(my_data_l, mean_var)

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