Извлечение столбцов с постоянными числами в R data.frames - PullRequest
0 голосов
/ 10 октября 2019

В data.frame DATA у меня есть несколько столбцов, которые являются постоянными числами в уникальных строках первого столбца с именем study.name. Например, столбцы ESL и prof имеют значение константа для всех строк Shin.Ellis и константа для всех строк Trus.Hsu и т. Д. Включая Shin.Ellis и Trus.Hsu, есть 8 уникальные study.name строки.

НО после моего вызова split.default() ниже, как я могу получить только одну точку данных для всехстроки под уникальным study.name (например, один для Shin.Ellis, один для Trus.Hsu и т. д.) для таких постоянных переменных? (т. е. 8 строк в целом)

Например, после моего split.default() все переменные с именем ESL show имеют только 8 строк для каждой уникальной study.name.

Мой желаемый выходной сигнал для ONLY ESL и prof показан ниже.

NOTE : Это игрушечные данные. Сначала мы должны найти постоянные переменные. Функциональный ответ высоко ценится.

DATA <- read.csv("https://raw.githubusercontent.com/izeh/m/master/irr.csv", h = T)[-(2:3)]
DATA <- setNames(DATA, sub("\\.\\d+$", "", names(DATA)))

tbl <- table(names(DATA))
nm2 <- names(which(tbl==max(tbl)))

L <- split.default(DATA[names(DATA) %in% nm2], names(DATA)[names(DATA) %in% nm2])


## FIRST 8 ROWS of `DATA`:

#    study.name ESL prof scope type   ESL   prof   scope   type
# 1  Shin.Ellis   1    2     1    1     1      2       1      1
# 2  Shin.Ellis   1    2     1    1     1      2       1      1
# 3  Shin.Ellis   1    2     1    2     1      2       1      1
# 4  Shin.Ellis   1    2     1    2     1      2       1      1
# 5  Shin.Ellis   1    2    NA   NA     1      2      NA     NA
# 6  Shin.Ellis   1    2    NA   NA     1      2      NA     NA
# 7    Trus.Hsu   2    2     2    1     2      2       1      1
# 8    Trus.Hsu   2    2    NA   NA     2      2      NA     NA
# .     ...       .    .     .    .     .      .       .      . # `DATA` has 54 rows overall

Желаемый вывод для ESL и prof после split.default() вызова:

# $ESL            ## 8 unique rows for 8 unique `study.name`
#    ESL ESL.1
# 1    1     1
# 7    2     2
# 9    1     1
# 17   1     1
# 23   1     1
# 35   1     1
# 37   2     2
# 49   2     2


# $prof           ## 8 unique rows for 8 unique `study.name`
#    prof prof.1
# 1     2      2
# 7     2      2
# 9     3      3
# 17    2      2
# 23    2      2
# 35    2      2
# 37   NA     NA
# 49    2      2

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Мы можем создать ожидаемый результат с помощью aggregate

is_constant <- function(x) length(unique(x)) == 1L 
nm1 <-  names(which(!colSums(!aggregate(.~ study.name, DATA, is_constant)[-1])))
L[nm1] <- lapply(L[nm1], function(x) aggregate(x, 
   list(factor(DATA$study.name, levels = unique(DATA$study.name))), 
          FUN = head, 1)[-1])
L
#$ESL
#  ESL ESL.1
#1   1     1
#2   2     2
#3   1     1
#4   1     1
#5   1     1
#6   1     1
#7   2     2
#8   2     2

#$prof
#  prof prof.1
#1    2      2
#2    2      2
#3    3      3
#4    2      2
#5    2      2
#6    2      2
#7   NA     NA
#8    2      2

#$scope
#...
1 голос
/ 10 октября 2019

Сначала мы можем найти постоянные столбцы, а затем использовать lapply, чтобы зациклить их и выбрать только их первую строку в каждом study.name.

is_constant <- function(x) length(unique(x)) == 1L 
cols <- names(Filter(all, aggregate(.~study.name, DATA, is_constant)[-1]))

L[cols] <- lapply(L[cols], function(x) 
                      x[ave(x[[1]], DATA$study.name, FUN = seq_along) == 1, ])
L

#$ESL
#   ESL ESL.1
#1    1     1
#7    2     2
#9    1     1
#17   1     1
#23   1     1
#35   1     1
#37   2     2
#49   2     2

#$prof
#   prof prof.1
#1     2      2
#7     2      2
#9     3      3
#17    2      2
#23    2      2
#35    2      2
#37   NA     NA
#49    2      2
#.....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...