根据现有数据在数据框中创建多个新行

问题描述 投票:0回答:1

假设我有以下数据集:

data.frame(country = c("A", "A", "B", "B", "C", "C"),
           type = c("x", "z", "x", "z", "x", "z"),
           value = c(4, 2, 6, 10, 54, 10))
  country type value
1       A    x     4
2       A    z     2
3       B    x     6
4       B    z    10
5       C    x    54
6       C    z    10

我想要做的是为每个国家/地区(A、B、C)创建多个新行,其中包含一个名为“z-x”的新类型和一个新值,该新值是值 z 和 x 之间的差值。我正在寻找这个输出:

data.frame(country = c("A", "A", "A", "B", "B", "B", "C", "C", "C"),
           type = c("x", "z", "z-x", "x", "z", "z-x", "x", "z", "z-x"),
           value = c(4, 2, -2, 6, 10, 4, 54, 10, -44))
  country type value
1       A    x     4
2       A    z     2
3       A  z-x    -2
4       B    x     6
5       B    z    10
6       B  z-x     4
7       C    x    54
8       C    z    10
9       C  z-x   -44
r row
1个回答
1
投票

这假设您的数据已经排序,以便(在每个国家/地区内)

x
位于
z
之前。

df |>
  summarize(type = "z - x",
            value = diff(value),
            .by = country) |>
  bind_rows(df) |>
  arrange(country, type)
#   country  type value
# 1       A     x     4
# 2       A     z     2
# 3       A z - x    -2
# 4       B     x     6
# 5       B     z    10
# 6       B z - x     4
# 7       C     x    54
# 8       C     z    10
# 9       C z - x   -44 

如果您希望更明确,这可以解决问题:

df |>
  summarize(
    value = value[type == "z"] - value[type == "x"],
    type = "z - x",
    .by = country) |>
  bind_rows(df) |>
  arrange(country, type)
© www.soinside.com 2019 - 2024. All rights reserved.