R: выполнить итерацию по двум спискам одновременно, используя lapply? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть несколько факторов, разделяющих мои данные.

По одному фактору (uniqueGroup) я хотел бы поднастроить свои данные, по другому коэффициенту (distance) я хочу сначала классифицировать свои данные по «порогу перемещения», а затем проверить статистическую разницу между группами.

Я создал функцию movThreshold, чтобы классифицировать мои данные и проверить ее по wilcox.test. Чтобы варьировать различные пороговые значения, я просто запускаю

lapply(th.list,       # list of thresholds
       movThreshold,  # my function
       tab = tab,     # original data
       dependent = "infGrad") # dependent variable

Теперь я понял, что на самом деле мне нужно сначала поднастроить мои данные на uniqueGroup, а затем изменить пороговое значение . Но я не уверен, как написать это в моем lapply коде?


Мои фиктивные данные:

set.seed(10)
infGrad <- c(rnorm(20, mean=14, sd=8),
            rnorm(20, mean=13, sd=5),
            rnorm(20, mean=8, sd=2),
            rnorm(20, mean=7, sd=1))
distance <- rep(c(1:4), each = 20)
uniqueGroup <- rep(c("x", "y"), 40)

tab<-data.frame(infGrad, distance, uniqueGroup)


# Create moving threshold function &
# test for original data
# ============================================

movThreshold <- function(th, tab, dependent, ...) {

  # Classify data 
  tab$group<- ifelse(tab$distance < th, "a", "b")

  # Calculate wincoxon test - as I have only two groups
  test<-wilcox.test(tab[[dependent]] ~ as.factor(group),  # specify column name
                    data = tab)

  # Put results in a vector 
  c(th, unique(tab$uniqueGroup), dependent, uniqueGroup, round(test$p.value, 3))

}

# Define two vectors to run through
# unique group
gr.list<-unique(tab$uniqueGroup)

# unique threshold
th.list<-c(2,3,4)

Как запустить lapply по двум спискам ??

lapply(c(th.list,gr.list),  # iterate over two vectors, DOES not work!!
              movThreshold, 
              tab = tab, 
              dependent = "infGrad")

В моем предыдущем вопросе ( тест Крускала-Уоллиса: создать функцию lapply для подмножества data.frame? ) я научился перебирать отдельные подмножества в таблице:

lapply(split(tab, df$uniqueGroup), movThreshold})

Но как перебрать подмножества и пороги сразу?

1 Ответ

0 голосов
/ 08 мая 2018

Если я правильно понял, что вы пытаетесь сделать, вот решение data.table:

library(data.table)
setDT(tab)[, lapply(th.list, movThreshold, tab = tab, dependent = "infGrad"), by = uniqueGroup]

Также вы можете просто сделать вложенный lapply.

lapply(gr.list, function(z) lapply(th.list, movThreshold, tab = tab[uniqueGroup == z, ], dependent = "infGrad"))

Прошу прощения, если я неправильно понял, что вы пытаетесь сделать.

...