Добавьте столбец в фрейм данных, пропустите вставку в строки с помощью - - PullRequest
1 голос
/ 11 июня 2019

У меня проблема со слиянием.

У меня есть 2 кадра данных.

фрейм данных 1:

structure(list(row = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 
2, 3), col = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5), 
    ltr = c("-", ".", ".", ".", ".", "Q", ".", "A", "R", "-", 
    ".", ".", ".", "T", ".")), row.names = c(NA, 15L), class = "data.frame")

dataframe2:

structure(list(freq = c("0.76423", "0.76423", "0.03546", "0.43677", 
"0.76972", "0.45678", "0.23145", "0.56835", "0.23145")), row.names = c(NA, 
-9L), class = "data.frame")

Я хочу скопировать столбец freq из dataframe2 в dataframe1. Я хочу избежать вставки в несколько рядов

если dataframe1 имеет ltr = "-" (пропустить эту строку и последующие строки с одинаковым значением col)

row col ltr freq
1    1   -   skip
2    1   .   skip
3    1   .   skip
1    2   .   0.76423

Я пробовал петли, но это не сработало. Результат должен выглядеть следующим образом

structure(list(row = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 
2, 3), col = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5), 
    ltr = c("-", ".", ".", ".", ".", "Q", ".", "A", "R", "-", 
    ".", ".", ".", "T", "."), freq = c("NA", "NA", "NA", "0.76423", 
    "0.76423", "0.03546", "0.43677", "0.76972", "0.45678", "NA", 
    "NA", "NA", "0.23145", "0.56835", "0.23145")), row.names = c(NA, 
15L), class = "data.frame")

Спасибо!

1 Ответ

3 голосов
/ 11 июня 2019

Можно сгруппировать по 'col', создать логический столбец, проверив наличие any '-' в столбце 'ltr' и replace элементов TRUE с 'freq' из второго набора данных ( 'df2')

library(dplyr)
df1 %>% 
   group_by(col) %>% 
   mutate(freq = if(any(ltr == "-")) NA else TRUE) %>% 
   ungroup %>% 
   mutate(freq = replace(freq, which(freq), df2$freq))
# A tibble: 15 x 4
#     row   col ltr   freq   
#   <dbl> <dbl> <chr> <chr>  
# 1     1     1 -     <NA>   
# 2     2     1 .     <NA>   
# 3     3     1 .     <NA>   
# 4     1     2 .     0.76423
# 5     2     2 .     0.76423
# 6     3     2 Q     0.03546
# 7     1     3 .     0.43677
# 8     2     3 A     0.76972
# 9     3     3 R     0.45678
#10     1     4 -     <NA>   
#11     2     4 .     <NA>   
#12     3     4 .     <NA>   
#13     1     5 .     0.23145
#14     2     5 T     0.56835
#15     3     5 .     0.23145

Или с помощью data.table, преобразовать «data.frame» в «data.table» (setDT(df1)), сгруппированный по «col», найти индекс строки (.I) на основе логического выражения, указать индекс в i и присвойте (:=) значения 'freq' из 'df2', чтобы создать столбец 'freq' в 'df1'. По умолчанию позиции, не входящие в i, будут заполнены NA

library(data.table)
i1 <- setDT(df1)[, .I[all(ltr != "-")], col]$V1
df1[i1, freq := df2$freq]
df1
#    row col ltr    freq
# 1:   1   1   -    <NA>
# 2:   2   1   .    <NA>
# 3:   3   1   .    <NA>
# 4:   1   2   . 0.76423
# 5:   2   2   . 0.76423
# 6:   3   2   Q 0.03546
# 7:   1   3   . 0.43677
# 8:   2   3   A 0.76972
# 9:   3   3   R 0.45678
#10:   1   4   -    <NA>
#11:   2   4   .    <NA>
#12:   3   4   .    <NA>
#13:   1   5   . 0.23145
#14:   2   5   T 0.56835
#15:   3   5   . 0.23145
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...