L oop на названиях столбцов с R - PullRequest
0 голосов
/ 20 апреля 2020

Я работаю с фреймом данных (называемым «dataEPM»), с несколькими столбцами, среди которых некоторые имеют увеличенные имена столбцов (ke_1, ke_2, .., ke_8). Для этих столбцов я хочу получить количество строк, соответствующих условию (== 3), и результат в выводе данных. Поэтому я пишу al oop в названиях столбцов. Вот код:

output_nb <- matrix(ncol=2, nrow=8)

for (i in 1:8){
  text <- paste("ke_",i, sep="")
  nb_i <- nrow(dataEPM[dataEPM$text == "3",])
  print(nrow(dataEPM[dataEPM$text == "3",]))
  output_nb[i,1] <- i
  output_nb[i,2] <- nb_i
}

output_nb <- data.frame(output_nb)

С помощью команды печати я вижу, что nrow(dataEPM[dataEPM$text == "3",]) всегда равно 0, но я заменяю имя столбца (например, nrow(dataEPM[dataEPM$ke_1 == "3",])), но это не так. Поэтому я предполагаю, что этот способ написания названия столбца здесь не принят.

Coudl, скажите, пожалуйста, как это исправить? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 20 апреля 2020

Если вы открыты для решения Tidyverse:

library(tidyverse)
#dataframe with many ke_# columns
dataEPM <- tibble(ke_1 = c(1, 2, 3, 4, 5), # 1 three
                  ke_2 = c(1, 2, 3, 3, 5), # 2 threes
                  ke_3 = c(1, 2, 3, 3, 3), # 3 threes
                  ke_4 = c(1, 3, 3, 3, 3)) # 4 threes

dataEPM %>% 
  pivot_longer(starts_with("ke"), "new_col") %>% #combine all ke_# columns into one col
  dplyr::filter(value == 3) %>% #filter for values ==3
  group_by(new_col) %>% #group by unique ke_#
  summarize(num = n()) #count # occurences in each group

# A tibble: 4 x 2
  new_col  nrow
  <chr>   <int>
1 ke_1        1
2 ke_2        2
3 ke_3        3
4 ke_4        4
0 голосов
/ 21 апреля 2020

Должно работать следующее:

for (i in 1:8){
  text_ <- paste("ke_",i, sep="")
  nb_i <- nrow(dataEPM[dataEPM[,text_] == "3",])
  print(nrow(dataEPM[dataEPM[,text_] == "3",]))
}

Просто используйте простые логические фильтры. Подскажите пожалуйста, работает ли он!

0 голосов
/ 21 апреля 2020

Мы можем использовать colSums для логического vector в base R

stack(colSums(dataEPM == 3))[2:1]
#   ind values
#1 ke_1      1
#2 ke_2      2
#3 ke_3      3
#4 ke_4      4

данных

dataEPM <- data.frame(ke_1 = c(1, 2, 3, 4, 5), # 1 three
                  ke_2 = c(1, 2, 3, 3, 5), # 2 threes
                  ke_3 = c(1, 2, 3, 3, 3), # 3 threes
                  ke_4 = c(1, 3, 3, 3, 3)) # 4 threes
...