R:基于行和列组合创建新列

R:基于行和列组合创建新列,r,R,我相信这可能很简单,但我找不到解决办法。。我有一系列的缓冲装置可以使用多年。在每个缓冲区中,我记录森林覆盖的范围。森林覆盖率逐年下降。在每个缓冲区中,我还有一种类型的管理 我想向数据集中添加两个新列: 关于管理类型0和1从2003年开始的原始森林范围的数据。第二种方法将森林覆盖率与2003年开始的两种管理方式的森林覆盖率联系起来 基于这些答案,我会假设使用以下内容: 在本例中,由于您不想更新现有变量,所以最好使用一个好的老式合并 dfNew <- merge(df, setNames(d

我相信这可能很简单,但我找不到解决办法。。我有一系列的缓冲装置可以使用多年。在每个缓冲区中,我记录森林覆盖的范围。森林覆盖率逐年下降。在每个缓冲区中,我还有一种类型的管理

我想向数据集中添加两个新列: 关于管理类型0和1从2003年开始的原始森林范围的数据。第二种方法将森林覆盖率与2003年开始的两种管理方式的森林覆盖率联系起来

基于这些答案,我会假设使用以下内容:


在本例中,由于您不想更新现有变量,所以最好使用一个好的老式
合并

dfNew <- merge(df, setNames(df[df$year == 2003, c("buff",  "manag", "area")],
                            c("buff",  "manag", "area2003")),
               by=c("buff",  "manag"))

# calculate change
dfNew$rate <- with(dfNew, 1 - abs(area - area2003) / area2003) * 100
在第一行中,我结合了许多步骤,将数据框子集设置为2003和感兴趣的列,并使用
setNames
命名变量和该子集中的data.frame

要按现有方式对data.frame进行排序,请使用

dfNew <- dfNew[with(dfNew, order(year, buff, manag)), ]

dplyr
tidyverse
)的
dfNew窗口函数最适合这种转换。更多的例子


美好的谢谢你,我需要在dplyr中深入研究;))
  buff area year manag area2003   rate
1    1  800 2003     0      800 100.00
2    1  700 2003     1      700 100.00
3    2  600 2003     0      600 100.00
4    2  500 2003     1      500 100.00
5    1  400 2004     0      800  50.00
6    1  300 2004     1      700  42.86
7    2  200 2004     0      600  33.34
8    2  100 2004     1      500  20.00
dfNew <- merge(df, setNames(df[df$year == 2003, c("buff",  "manag", "area")],
                            c("buff",  "manag", "area2003")),
               by=c("buff",  "manag"))

# calculate change
dfNew$rate <- with(dfNew, 1 - abs(area - area2003) / area2003) * 100
dfNew
  buff manag area year area2003      rate
1    1     0  800 2003      800 100.00000
2    1     0  400 2004      800  50.00000
3    1     1  700 2003      700 100.00000
4    1     1  300 2004      700  42.85714
5    2     0  600 2003      600 100.00000
6    2     0  200 2004      600  33.33333
7    2     1  500 2003      500 100.00000
8    2     1  100 2004      500  20.00000
dfNew <- dfNew[with(dfNew, order(year, buff, manag)), ]
dfNew <- merge(df, df[df$year == 2003, c("buff",  "manag", "area")],
               by=c("buff",  "manag"))

names(dfNew) <- c("buff",  "manag", "area", "year", "area2003")
library(tidyverse)

data_frame(
    buff = rep(1:2, 2, each = 2),
    area = 8:1*100,
    year = rep(2003:2004, each = 4),
    manag = rep(0:1, 4)
    ) %>%
    group_by(buff, manag) %>%
    arrange(year) %>%
    mutate(area2003 = first(area), rate = area/area2003*100)