Как заполнить строки данными из другой строки с таким же ссылочным значением? - PullRequest
0 голосов
/ 25 марта 2019

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

Я пытался использовать функции для заполнения пробелов от значений к значениям, но это не то, что я ожидаю сделать.Как пример, REF "80" не имеет ничего для заполнения.Я пытался добавить «если заявления» без удовлетворения результатов.

Стартовая таблица:

╔═══╤═════╤═════╤═════╗
║   │ REF │ SC1 │ SC2 ║
╠═══╪═════╪═════╪═════╣
║ 1 │ 42  │     │     ║
╟───┼─────┼─────┼─────╢
║ 2 │ 42  │     │     ║
╟───┼─────┼─────┼─────╢
║ 3 │ 42  │ VU  │ NT  ║
╟───┼─────┼─────┼─────╢
║ 4 │ 80  │     │     ║
╟───┼─────┼─────┼─────╢
║ 5 │ 56  │     │     ║
╟───┼─────┼─────┼─────╢
║ 6 │ 56  │     │     ║
╟───┼─────┼─────┼─────╢
║ 7 │ 56  │ DD  │ NA  ║
╚═══╧═════╧═════╧═════╝

У таблицы код:

table <- matrix(c(42,"","",42,"","",42,"VU","NT",80,"","",56,"","",56,"","",56,"DD","NA"),ncol=3,byrow=TRUE)
colnames(table) <- c("REF","SC1","SC2")
rownames(table) <- c(1,2,3,4,5,6,7)
table <- as.table(table)

Ожидаемая таблица:

╔═══╤═════╤═════╤═════╗
║   │ REF │ SC1 │ SC2 ║
╠═══╪═════╪═════╪═════╣
║ 1 │ 42  │ VU  │ NT  ║
╟───┼─────┼─────┼─────╢
║ 2 │ 42  │ VU  │ NT  ║
╟───┼─────┼─────┼─────╢
║ 3 │ 42  │ VU  │ NT  ║
╟───┼─────┼─────┼─────╢
║ 4 │ 80  │     │     ║
╟───┼─────┼─────┼─────╢
║ 5 │ 56  │ DD  │ NA  ║
╟───┼─────┼─────┼─────╢
║ 6 │ 56  │ DD  │ NA  ║
╟───┼─────┼─────┼─────╢
║ 7 │ 56  │ DD  │ NA  ║
╚═══╧═════╧═════╧═════╝

Ответы [ 3 ]

0 голосов
/ 25 марта 2019

подход к data.table ..

сначала преобразуйте таблицу в data.table, затем присоединитесь к себе

library(data.table)
DT <- setDT( as.data.frame.matrix( table, stringsAsFactors = FALSE ) )
DT[ DT[!SC1 == "",], `:=`( SC1 = i.SC1, SC2 = i.SC2 ), on = "REF"][]

#    REF SC1 SC2
# 1:  42  VU  NT
# 2:  42  VU  NT
# 3:  42  VU  NT
# 4:  80        
# 5:  56  DD  NA
# 6:  56  DD  NA
# 7:  56  DD  NA
0 голосов
/ 25 марта 2019

В базе R, сохраняя вашу строку "NA":

table <- matrix(c(42,"","",42,"","",42,"VU","NT",80,"","",56,"","",56,"","",56,"DD","NA"),ncol=3,byrow=TRUE)
colnames(table) <- c("REF","SC1","SC2")
rownames(table) <- c(1,2,3,4,5,6,7)

keys <- table[rowSums(apply(table, 2, nchar) > 0) == 3, ]
merge(data.frame(REF = table[, "REF"]), keys, all = TRUE)

>   REF  SC1  SC2
1  42   VU   NT
2  42   VU   NT
3  42   VU   NT
4  56   DD   NA
5  56   DD   NA
6  56   DD   NA
7  80 <NA> <NA>
0 голосов
/ 25 марта 2019

Использование dplyr и пользовательская функция.

library(dplyr)
table <- matrix(c(42,"","",42,"","",42,"VU","NT",80,"","",56,"","",56,"","",56,"DD","NA"),
                ncol=3,
                byrow=TRUE)
colnames(table) <- c("REF","SC1","SC2")
rownames(table) <- c(1,2,3,4,5,6,7)
#table <- as.table(table) ## i am not using this command

Создание функции, которая заменяет "" на ближайшее, не "" значение

replace_with_last<-function(x, a = !is.na(x)){
  x[which(a)[c(1, 1:sum(a))][cumsum(a)+1]]
}

Выполнение

foo <- table %>%
  as_tibble %>%
  group_by(REF) %>%
  mutate(SC1 = replace_with_last(x = SC1, a = SC1 != ""),
         SC2 = replace_with_last(x = SC2, a = SC2 != ""))

Что приводит к

  REF   SC1   SC2  
  <chr> <chr> <chr>
1 42    VU    NT   
2 42    VU    NT   
3 42    VU    NT   
4 80    NA    NA   
5 56    DD    NA   
6 56    DD    NA   
7 56    DD    NA 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...