我有一个包含ID列,其他ID列表和值的数据框。我正在寻找使用列表列中ID值的总和创建一个新列。
例如:
ID x Value New Column
1 c(2,3,4) 6 17
2 c(1,3,4,7,8,9) 8
3 c(1,2) 4 14
4 c(1,3,5) 5
这里,我们不知道第二行和第四行中新列的值,因为我们没有第5行,第7行,第8行和第9行的数据。第一行的新列是8 + 4 + 5,或17.实际数据框中没有丢失的数据。
如何对数据框中的所有行执行此操作?
谢谢!
答案 0 :(得分:0)
我认为试图维持这种结构会产生很大的开销。我可能会建议一种不同的结构化方式吗?
A"价值观" data.frame,仅与每个id
和value
拥有:
values <- data.frame(id = 1:4, value = c(6,8,4,5))
另一个data.frame,对于每个id
,映射哪些依赖 - id
被合并到其中:
inclusions <- data.frame(
id = c(1,1,1, 2,2,2,2,2,2, 3,3, 4,4,4),
useid = c(2,3,4, 1,3,4,7,8,9, 1,2, 1,3,5)
)
从这里开始,我们只需要做一些连接即可得到我们需要的东西。它的方便之处在于您不必尝试解析子数据框架列表等。
library(dplyr)
full_join(inclusions, values, by = c("useid" = "id")) %>%
select(-useid) %>%
group_by(id) %>%
summarize(newvalue = sum(value))
# # A tibble: 4 × 2
# id newvalue
# <dbl> <dbl>
# 1 1 17
# 2 2 NA
# 3 3 14
# 4 4 NA
由于第一次加入中存在一些缺失值,NA
会导致后续sum
到NA
。方便。
答案 1 :(得分:0)
进行一些查找:
sapply(df$x, function(x) sum(df$Value[match(x, df$ID)]) )
#[1] 17 NA 14 NA
df
的位置:
df <- data.frame(
ID = 1:4, x = I(list(c(2,3,4), c(1,3,4,7,8,9), c(1,2), c(1,3,5))),
Value = c(6L, 8L, 4L, 5L))