Как извлечь кадр данных из другого кадра данных в R - PullRequest
0 голосов
/ 02 декабря 2018

Я работал с консолидированным df и использую summarise(n = count(var)), чтобы понять дубликаты.Затем я получил этот объектный вызов x:

      n.x         n.freq
1 001121011522      1
2 001121711014      1
3 001121711015      1
4 001121711722      1
5 001121711723      1
6 001131811722      1

Я знаю, n.freq идет от 1 до 6, поэтому я хочу взять только те, которые выше или равны 2:

y <- x %>% filter(n$freq >= 2)

Но я получил это:

Error: Column `n` must be a 1d atomic vector or a list
Call `rlang::last_error()` to see a backtrace

Итак, я проверил его структуру и получил это:

    > str(x)
'data.frame':   485843 obs. of  1 variable:
 $ n:'data.frame':  485843 obs. of  2 variables:
  ..$ x   : Factor w/ 485843 levels "001121011522",..: 1 2 3 4 5 6 7 8 9 10 ...
  ..$ freq: int  1 1 1 1 1 1 1 1 1 1 ...

Так что, как я понимаю, внутри другого есть df,Я хочу знать, как извлечь второй (внутренний) df, чтобы использовать его.

[ОБНОВЛЕНИЕ]: используя dput(head(x, 20)) Я получил:

"ABC253478", "ABC983659", "ABC654911", "ABC882310", 
..... # there were at least 100 rows of results
"ABC665892", "ABC441276", "ABC906138", "ABC679967"
), class = "factor"), freq = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 
20L), class = "data.frame")), row.names = c(NA, 20L), class = "data.frame")

1 Ответ

0 голосов
/ 02 декабря 2018

Есть есть , что-то не так с этими данными ... но давайте посмотрим, смогу ли я воспроизвести достаточно.(Предварительно: не идеально, но у нас пока недостаточно информации, чтобы можно было это значительно улучшить.)

Некоторые примеры данных, написанные вручную для проверки того, что я думаю о ваших пропущенных строках:

x <- structure(
  list(n = structure(
    list(x = structure(c(3L, 7L, 6L, 2L, 10L, 9L, 1L, 8L, 4L, 5L),
                       .Label = c("112916", "116806", "118489", "146802", "154999",
                                  "157333", "170238", "183345", "194348", "194384"),
                       class = "factor"),
         freq = c(2L, 1L, 3L, 1L, 2L, 3L, 3L, 1L, 2L, 1L)),
    class = "data.frame", row.names = c(NA, -10L) ) ),
  class = "data.frame", row.names = c(NA, -10L)
)
str(x)
# 'data.frame': 10 obs. of  1 variable:
#  $ n:'data.frame':    10 obs. of  2 variables:
#   ..$ x   : Factor w/ 10 levels "112916","116806",..: 3 7 6 2 10 9 1 8 4 5
#   ..$ freq: int  2 1 3 1 2 3 3 1 2 1

Это не повторяет вашу ошибку:

str( x %>% filter(n$freq >= 2) )
# 'data.frame': 6 obs. of  1 variable:
#  $ n:'data.frame':    6 obs. of  2 variables:
#   ..$ x   : Factor w/ 10 levels "112916","116806",..: 3 6 10 9 1 4
#   ..$ freq: int  2 3 2 3 3 2

Возможно, это будет работать вместо вас?

str( subset(x, n$freq >= 2) )
# 'data.frame': 6 obs. of  1 variable:
#  $ n:'data.frame':    6 obs. of  2 variables:
#   ..$ x   : Factor w/ 10 levels "112916","116806",..: 3 6 10 9 1 4
#   ..$ freq: int  2 3 2 3 3 2

К сожалению, это может сработать для вас, но имеет эффектсглаживания базы данных (без намерения):

str( x[ x$n$freq >= 2, ] )
# 'data.frame': 6 obs. of  2 variables:
#  $ x   : Factor w/ 10 levels "112916","116806",..: 3 6 10 9 1 4
#  $ freq: int  2 3 2 3 3 2

Похоже, что этот вложенный фрейм довольно просто распутать:

str( x[[1]] )
# 'data.frame': 10 obs. of  2 variables:
#  $ x   : Factor w/ 10 levels "112916","116806",..: 3 7 6 2 10 9 1 8 4 5
#  $ freq: int  2 1 3 1 2 3 3 1 2 1

Итак, давайте попробуем заменить вложенный фрейм на "нормальный "один:

xflat <- x[[1]]
str( filter(xflat, freq >= 2) )
# 'data.frame': 6 obs. of  2 variables:
#  $ x   : Factor w/ 10 levels "112916","116806",..: 3 6 10 9 1 4
#  $ freq: int  2 3 2 3 3 2
str( subset(xflat, freq >= 2) )
# 'data.frame': 6 obs. of  2 variables:
#  $ x   : Factor w/ 10 levels "112916","116806",..: 3 6 10 9 1 4
#  $ freq: int  2 3 2 3 3 2
str( xflat[ xflat$freq >= 2, ] )
# 'data.frame': 6 obs. of  2 variables:
#  $ x   : Factor w/ 10 levels "112916","116806",..: 3 6 10 9 1 4
#  $ freq: int  2 3 2 3 3 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...