我有这个数据帧:
df <- data.frame(group=c("A", "A", "B", "B"), year=c(1980, 1986, 1990, 1992))
group year
1 A 1980
2 A 1986
3 B 1990
4 B 1992
Run Code Online (Sandbox Code Playgroud)
我想通过以下方式修改它:
这将是结果:
group year pre
1 A 1978 pre1980
2 A 1979 pre1980
3 A 1984 pre1986
4 A 1985 pre1986
5 B 1988 pre1990
6 B 1989 pre1990
7 B 1990 pre1992
8 B 1991 pre1992
Run Code Online (Sandbox Code Playgroud)
添加新列很容易..
df$pre <- paste("pre", df$year, sep="")
Run Code Online (Sandbox Code Playgroud)
但我仍然坚持如何添加相应年份的新行(当然创建一个全新的数据框架也同样好).任何提示?
base R FTW:
data.frame(group = rep(df$group, each=2),
year = df[rep(1:nrow(df), each=2),]$year-2:1,
pre = paste0("pre",rep(df$year,each=2)))
# group year pre
# 1 A 1978 pre1980
# 2 A 1979 pre1980
# 3 A 1984 pre1986
# 4 A 1985 pre1986
# 5 B 1988 pre1990
# 6 B 1989 pre1990
# 7 B 1990 pre1992
# 8 B 1991 pre1992
Run Code Online (Sandbox Code Playgroud)
使用data.table包,这是一种方法.根据给定的数据,我决定使用year作为组变量.对于每一年,我计算前两年,并创建年份前的****.有两年的专栏,所以我最后删除了其中一列.
setDT(df)[, list(group = group,
year = c((year - 2), (year - 1)),
pre = paste0("pre", year, collapse = "")), by = "year"][, -1, with = FALSE][]
# group year pre
#1: A 1978 pre1980
#2: A 1979 pre1980
#3: A 1984 pre1986
#4: A 1985 pre1986
#5: B 1988 pre1990
#6: B 1989 pre1990
#7: B 1990 pre1992
#8: B 1991 pre1992
Run Code Online (Sandbox Code Playgroud)
如果你有相同的一年出现两次以上,你会做类似以下的事情.这个新的数据框架在1992年出现了两次.
df <- data.frame(group=c("A", "A", "B", "B"), year=c(1980, 1986, 1992, 1992))
setDT(df)[, list(group = group,
year = c((year - 2), (year - 1)),
pre = paste0("pre", year, collapse = "")), by = rownames(df)][, -1, with = FALSE]
# group year pre
#1: A 1978 pre1980
#2: A 1979 pre1980
#3: A 1984 pre1986
#4: A 1985 pre1986
#5: B 1990 pre1992
#6: B 1991 pre1992
#7: B 1990 pre1992
#8: B 1991 pre1992
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1057 次 |
| 最近记录: |