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