在[R]中,为组的每个值生成新变量

在[R]中,为组的每个值生成新变量,r,syntax,grouping,time-series,R,Syntax,Grouping,Time Series,我有id变量和date变量,其中给定id(面板)有多个日期。我想根据给定id的任何年份是否满足逻辑条件生成一个新变量。我不知道如何编码,所以请不要把下面的代码当作R代码,就像逻辑伪代码一样。差不多 foreach(i in min(id):max(id)) { if(var1[yearvar[1:max(yearvar)]=="A") then { newvar==1} } 例如: ID Year Letter 1 1999 A 1 2000

我有id变量和date变量,其中给定id(面板)有多个日期。我想根据给定id的任何年份是否满足逻辑条件生成一个新变量。我不知道如何编码,所以请不要把下面的代码当作R代码,就像逻辑伪代码一样。差不多

foreach(i in min(id):max(id)) {
if(var1[yearvar[1:max(yearvar)]=="A") then { newvar==1}
}
例如:

ID     Year     Letter
1     1999        A
1     2000        B
2     2000        C
3     1999        A
应返回
newvar
1. 1. 0 一,


由于
数据[ID==1]
在某一年中包含A,因此在2000年它也应该
==1
,尽管该年
字母==B

这里有一个使用
plyr
的解决方案:

library(plyr)
a <- ddply(dat, .(ID), summarise, newvar = as.numeric(any(Letter == "A")))
merge(ID, a, by="ID")
库(plyr)

a这里有一个使用
plyr
的解决方案:

library(plyr)
a <- ddply(dat, .(ID), summarise, newvar = as.numeric(any(Letter == "A")))
merge(ID, a, by="ID")
库(plyr)

a这里有一种用R基来接近它的方法:

#Find which ID meet first criteria
withA <- unique(dat$ID[dat$Letter == "A"])

#add new column based on whether ID is in withA
dat$newvar <- as.numeric(dat$ID %in% withA)

#    ID Year Letter newvar
# 1  1 1999      A      1
# 2  1 2000      B      1
# 3  2 2000      C      0
# 4  3 1999      A      1
#查找符合第一个标准的ID

对于a,这里有一种方法可以用R来接近它:

#Find which ID meet first criteria
withA <- unique(dat$ID[dat$Letter == "A"])

#add new column based on whether ID is in withA
dat$newvar <- as.numeric(dat$ID %in% withA)

#    ID Year Letter newvar
# 1  1 1999      A      1
# 2  1 2000      B      1
# 3  2 2000      C      0
# 4  3 1999      A      1
#查找符合第一个标准的ID

使用a而不使用软件包:

dat <- data.frame(
    ID = c(1,1,2,3),
    Year = c(1999,2000,2000,1999),
    Letter = c("A","B","C","A")
)
tableData <- table(dat[,c("ID","Letter")])
newvar <- ifelse(tableData[dat$ID,"A"]==1,1,0)
dat <- cbind(dat,newvar)

#  ID Year Letter newvar
#1  1 1999      A      1
#2  1 2000      B      1
#3  2 2000      C      0
#4  3 1999      A      1

dat不使用软件包:

dat <- data.frame(
    ID = c(1,1,2,3),
    Year = c(1999,2000,2000,1999),
    Letter = c("A","B","C","A")
)
tableData <- table(dat[,c("ID","Letter")])
newvar <- ifelse(tableData[dat$ID,"A"]==1,1,0)
dat <- cbind(dat,newvar)

#  ID Year Letter newvar
#1  1 1999      A      1
#2  1 2000      B      1
#3  2 2000      C      0
#4  3 1999      A      1

dat如果在ddply()中用transform替换summary,则不需要使用merge()。如果在ddply()中用transform替换summary,则不需要使用merge()。