Как я могу добавить размер 2 фрейма данных в зависимости от содержимого столбца? - PullRequest
1 голос
/ 05 ноября 2019

Я хотел бы решить эту проблему в R

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

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

df_small$column2<-c("A", "B","C");
df_big$column3<-c("A", "B","B","B","C","C")

Я хотел бы повторить строки, содержащие B, два раза в df_small, и повторить, как только строка, содержащая "C». Я пытался что-то вроде этого.

i=1
while (i <= nrow(df_big)) {
  if (df_big$column3[i+1]==df_small[i,2]){
    df_small<-rbind(df_small, df:small[i,1:2]) #df_small has two columns
    i=i+1
  } else{
    i=i+1
    next
  }

}

Это не работает. Я не очень знаком с циклами в R и не знаю, в чем ошибка. Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Dplyr решение:

library(dplyr)
df_small <- tibble(column2 = c("A", "B","C"), col = 1:3)
df_big  <- tibble(column3 = c("A", "B","B","B","C","C"), col = 100*1:6)
inner_join(df_small, select(df_big, column3), c("column2" = "column3"))
#> # A tibble: 6 x 2
#>   column2   col
#>   <chr>   <int>
#> 1 A           1
#> 2 B           2
#> 3 B           2
#> 4 B           2
#> 5 C           3
#> 6 C           3

select(df_big, column3) здесь, чтобы убедиться, что мы не добавляем ничего ненужного из df_big.

1 голос
/ 05 ноября 2019

Один из вариантов - использовать merge для объединения таблиц.

df_small <- data.frame(column1 = runif(3), 
                                             column2 = LETTERS[1:3], 
                                             column3 = rpois(3,3))
df_big <- data.frame(column1 = runif(6), 
                                         column2 = rpois(6, 3),
                                         column3 = c("A", "B","B","B","C","C"))
merge(df_small, df_big, 
            by.x = 'column2', by.y = 'column3')
#>   column2 column1.x column3 column1.y column2.y
#> 1       A 0.3445707       3 0.2213069         0
#> 2       B 0.6452454       4 0.9294447         3
#> 3       B 0.6452454       4 0.3348785         6
#> 4       B 0.6452454       4 0.5433028         3
#> 5       C 0.4662731       4 0.6461483         1
#> 6       C 0.4662731       4 0.4180109         2

Создано в 2019-11-05 пакетом Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...