我有以下数据集:
dataloc <- data.frame(id = c("FAS","FAS","FAS","FES","FES"),
gen = c(9,0,0,8,0),
lipd = c(0,2,3,0,5),
stringsAsFactors = FALSE)
所以我有两个组:FAS
和FES
。对于每一组,我想创建3行重复gen
的非零值,每一行lipd
的非零值,最后一行从gen
中减去lipd
sum。每行都有一个已定义的名称。这是预期的输出:
Name Value
First 9
Second 9
Third 9
Added 2
Added 3
Result 4
First 8
Second 8
Third 8
Added 5
Result 3
我可以使用以下代码创建结果行:
dataloc %>% group_by(id) %>%
summarise(value = sum(gen) - sum(lipd)) %>%
mutate(name = "Result") %>%
select("name","value")
但我还是坚持基于非零值创建n行,并给它们命名。在R基础或tidyverse方面的任何帮助都将非常感谢。
发布于 2020-07-24 15:41:29
这是一个基本的R解决方案。也许有更简单的解决方案,但这一个有效。
sp <- split(dataloc, dataloc$id)
res <- lapply(sp, function(DF){
i <- which(DF[['gen']] != 0)
j <- which(DF[['lipd']] != 0)
tmp <- rbind(DF[rep(i, 3), ], DF[j, ])
Value <- rowSums(tmp[-1])
Value <- c(Value, Value[1] - sum(DF[j, 'lipd']))
Name <- c("First", "Second", "Third", rep("Added", length(j)), "Result")
id <- rep(DF[['id']][1], length(Name))
data.frame(id, Name, Value)
})
res <- do.call(rbind, res)
row.names(res) <- NULL
res
# id Name Value
#1 FAS First 9
#2 FAS Second 9
#3 FAS Third 9
#4 FAS Added 2
#5 FAS Added 3
#6 FAS Result 4
#7 FES First 8
#8 FES Second 8
#9 FES Third 8
#10 FES Added 5
#11 FES Result 3
最后的清理。
rm(sp)
https://stackoverflow.com/questions/63076581
复制相似问题