在表上应用算法后,即使有多个行,所需的结果也仅应用于相应的行之一。我想用相应的值填补空白。
我尝试使用函数来填充值之间的空白,但这不是我期望的。例如,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 ║
╚═══╧═════╧═════╧═════╝
答案 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>