如何用参考值相同的另一行中的数据填充行?

时间:2019-03-25 13:47:26

标签: r matrix

在表上应用算法后,即使有多个行,所需的结果也仅应用于相应的行之一。我想用相应的值填补空白。

我尝试使用函数来填充值之间的空白,但这不是我期望的。例如,REF“ 80”不需要填充。我尝试添加“ if语句”,但结果不令人满意。

起始桌:

╔═══╤═════╤═════╤═════╗
║   │ 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 :(得分:0)

使用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 

答案 1 :(得分:0)

数据表方法..

首先将表转换为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

答案 2 :(得分:0)

在基数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>