Разблокировать смешанный Dataframe в Rows. р - PullRequest
0 голосов
/ 09 ноября 2018

Пробирался через ранее отвеченные вопросы, но не мог найти ни одной строки с тем, что я пытаюсь сделать.

Вот упрощенная версия того, что у меня есть:

Names = c("Andy", "Bill", "Carl", "Dave")
Letters = c("A", list(c("A", "B", "C")), list(c("B", "C")), "B")
DATA = as.data.frame(cbind(Names, Letters))

Вот упрощенная версия того, что я хочу:

Names2 = c("Andy", rep("Bill", 3), rep("Carl", 2), "Dave")
Letters2 = c("A", "A", "B", "C", "B", "C", "B")
DATA2 = as.data.frame(cbind(Names2, Letters2))

Я уверен, что это просто, но я все делаю.

Приветствия

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Может быть, вы похожи на меня и хотите использовать базовую функциональность R.

do.call(
    rbind, c(apply(DATA, 1, function(x){cbind.data.frame(Names = x[1],Letters = unlist(x[2]))}),  make.row.names = FALSE)
)

#  Names Letters
#1  Andy       A
#2  Bill       A
#3  Bill       B
#4  Bill       C
#5  Carl       B
#6  Carl       C
#7  Dave       B

просто как дополнение с использованием data.table.

data.table::setDT(DATA)[, .(Letters = unlist(Letters)), by = .(Names = unlist(Names))]

#   Names Letters
#1:  Andy       A
#2:  Bill       A
#3:  Bill       B
#4:  Bill       C
#5:  Carl       B
#6:  Carl       C
#7:  Dave       B
0 голосов
/ 09 ноября 2018

Это еще один логически простой метод. Вы должны сделать два вектора, один для Имен и другой для Буквы .

vecName=vector()
vecLetter=vector()

Теперь вы должны пройти по всем именам в DATA , используя внешний цикл. Во внутреннем цикле вы должны разделить буквы и заполнить оба вектора (vecName и vecLetter).

r=1
for(i in 1:nrow(DATA))
{
  for(j in 1:length(DATA$Letters[[i]]))
  {
        vecName[r]=DATA$Names[[i]]
        vecLetter[r]=DATA$Letters[[i]][j]
        r=r+1
  }
}

Наконец, объедините оба вектора и создайте еще один кадр данных.

df=data.frame(vecName,vecLetter)
0 голосов
/ 09 ноября 2018

Функция tidyr unnest может помочь вам в этом. Единственная проблема, с которой вы столкнулись, состоит в том, что ваш фрейм DATA содержит вектор списков в каждом столбце. Если мы сначала преобразуем столбец «Имена» в символьный вектор, вы можете удалить вложенные списки букв:

Names <- c("Andy", "Bill", "Carl", "Dave")
Letters <- c("A", list(c("A", "B", "C")), list(c("B", "C")), "B")
DATA <- as.data.frame(cbind(Names, Letters))

DATA
  Names Letters
1  Andy       A
2  Bill A, B, C
3  Carl    B, C
4  Dave       B

str(DATA)
'data.frame':   4 obs. of  2 variables:
 $ Names  :List of 4
  ..$ : chr "Andy"
  ..$ : chr "Bill"
  ..$ : chr "Carl"
  ..$ : chr "Dave"
 $ Letters:List of 4
  ..$ : chr "A"
  ..$ : chr  "A" "B" "C"
  ..$ : chr  "B" "C"
  ..$ : chr "B"

Итак, мы конвертируем имена

DATA %>%
  dplyr::mutate(Names = unlist(Names)) %>%
  unnest()

  Names Letters
1  Andy       A
2  Bill       A
3  Bill       B
4  Bill       C
5  Carl       B
6  Carl       C
7  Dave       B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...