R: Как детоксифицировать переменную внутри другой агрегатной функции? - PullRequest
0 голосов
/ 29 сентября 2019

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

Пример набора данных: Sample.df -> (только серийные номерадля табличного представления)

1.  A  B  E
2.  Y  1  123
3.  N  0  345
4.  Y  1  541
5.  Y  1  567

str (Sample.df) ->

1. $ A : Factor w/ 2 levels "N","Y"
2. $ B : Factor w/ 2 levels  0,1
3. $ E : int 123 345 541 567

Пример желаемого вывода со значениями столбца E:

1. Col A with Level Y 
123
541
567

2. Col B with level 0
345

Iнаписал цикл for для извлечения всех значений столбца E

for(i in 1:3) {
    levels_check <- levels(Sample.df[,i])
        if( !is.null(levels_check)){      
          temp_level <- levels(Sample.df[,i])
          level_1 <- as.name(temp_level[1])
          level_2 <- as.name(temp_level[2])
        x[i] <- mean(Sample.df[which(Sample.df$as.name(names(Sample.df[i]))==as.name(level_1),names(Sample.df) %in% c("E"))])
          i <- i+1
        }
}

В поисках решения для детокенизации значения переменной в операторе общего потока цикла.

1 Ответ

0 голосов
/ 29 сентября 2019

Нечто подобное может производить то, что вы хотите.

for (i in seq_along(levels(df$A))) {
  sub_df <- split(df, df$A)
  print(names(sub_df[i]))
  print(sub_df[[i]]["E"])
  #if you don't want to pass "E" manually, and you know it is the last col
  #print(df_sub[[i]][ncol(df_sub[[i]])])
}

# [1] "N"
# E
# 2 345
# [1] "Y"
# E
# 1 123
# 3 541
# 4 567

Вы можете ?split, если хотите увидеть его Usage.

Данные

#dput(df)
structure(list(A = structure(c(2L, 1L, 2L, 2L), .Label = c("N", 
"Y"), class = "factor"), B = structure(c(2L, 1L, 2L, 2L), .Label = c("0", 
"1"), class = "factor"), E = c(123L, 345L, 541L, 567L)), row.names = c(NA, 
-4L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...