R - 如何将变量加到另一个变量列表中包含的某些级别?

时间:2017-03-08 22:55:54

标签: r

我有一个包含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.实际数据框中没有丢失的数据。

如何对数据框中的所有行执行此操作?

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为试图维持这种结构会产生很大的开销。我可能会建议一种不同的结构化方式吗?

A"价值观" data.frame,仅与每个idvalue拥有:

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会导致后续sumNA。方便。

答案 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))