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

У меня есть фрейм данных (df) ответов на опрос о человеческих ценностях с 57 столбцами / переменными числовых / масштабных ответов.Каждый столбец принадлежит к одной из десяти категорий, и они не входят в смежные группы.

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

scoretable <- data.frame(
     valuename = 
     c("Conformity","Tradition","Benevolence","Universalism","Self- 
     Direction","Stimulation","Hedonism","Achievement","Power","Security"),
     valuevars = I(list(c(11,20,40,47), # Conformity
                        c(18,32,36,44,51), # Tradition
                        c(33,45,49,52,54), # Benevolence
                        c(1,17,24,26,29,30,35,38), # Universalism
                        c(5,16,31,41,53), # Self-Direction
                        c(9,25,37), # Stimulation
                        c(4,50,57), # Hedonism
                        c(34,39,43,55), # Achievement
                        c(3,12,27,46), # Power
                        c(8,13,15,22,56))), # Security
     stringsAsFactors=FALSE)

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

valuescore = function(df,scoretable,valueresults){
    valuename = scoretable[,1]
    set <- df[,scoretable[,2]]
    setmeans <- colMeans(set,na.rm=TRUE)
    valuemean <- mean(setmeans)
    setvars <- apply(set, 2, var)
    valuesd <-sqrt(mean(setvars))
    rbind(valueresults,c(valuename, valuemean, valuesd))
}

a <- nrow(scoretable)
for(i in 1:a){
    valuescore(df,scoretable[i,],valueresults)
}

Я очень плохо знаком с R и программированием в целом (это мой первый вопрос здесь), и я изо всех сил пытаюсь определить, как передать списокпеременные для функций и / или диапазоны адресов для фреймов данных.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Давайте создадим пример data.frame:

df <- replicate(57, rnorm(10, 50, 20)) %>% as.data.frame()

Давайте подготовим формат результата таблицы:

valueresults <- data.frame(
  name = scoretable$valuename, 
  mean = 0
)

Теперь цикл по значениям таблицы показателей, вычисление среднего значения постолбец, а затем среднее значение.Это брутально (первый ответ с Map более элегантно), но, возможно, его легче понять начинающему R.

for(v in 1:nrow(scoretable)){
  # let's suppose v = 1 "Conformity"
  columns_id <- scoretable$valuevars[[v]]

  # isolate columns that correspond to 'Conformity'
  temp_df    <- df[, columns_id]

  # mean of the values of these columns
  temp_means <- apply(temp_df, 2, mean)
  mean       <- mean(temp_means)

  # save result in the prepared table
  valueresults$mean[v] <- mean
}

> (valueresults)
             name     mean
1      Conformity 45.75407
2       Tradition 52.76935
3     Benevolence 50.81724
4    Universalism 51.04970
5  Self-Direction 55.43723
6     Stimulation 52.15962
7        Hedonism 53.17395
8     Achievement 47.77570
9           Power 52.61731
10       Security 54.07066
0 голосов
/ 07 февраля 2019

Вот способ использования Map для применения функции к списку scoretable[, 2].

Сначала я создам тест df.

set.seed(1234)
m <- 100
n <- 57
df <- matrix(sample(10, m*n, TRUE), nrow = m, ncol = n)
df <- as.data.frame(df)

А теперь функция valuescore.

valuescore <- function(DF, scores){
  f <- function(inx) mean(as.matrix(DF[, inx]), na.rm = TRUE)
  res <- Map(f, scores[, 2])
  names(res) <- scores[[1]]
  res
}

valuescore(df, scoretable)
#$Conformity
#[1] 5.5225
#
#$Tradition
#[1] 5.626
#
#$Benevolence
#[1] 5.548
#
#$Universalism
#[1] 5.36125
#
#$`Self-Direction`
#[1] 5.494
#
#$Stimulation
#[1] 5.643333
#
#$Hedonism
#[1] 5.546667
#
#$Achievement
#[1] 5.3175
#
#$Power
#[1] 5.41
#
#$Security
#[1] 5.54
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...