【发布时间】:2020-01-02 02:02:22
【问题描述】:
我有数据框:
a<-c(1,2,3,4)
b<-c(1988,1970,1999,2000)
years_practicing<-rep(NA,4)
df<-data.frame("ID"=a, "grad_year"=b, "years_practicing"=years_practicing)
看起来像:
ID grad_year years_practicing
1 1988 NA
2 1970 NA
3 1999 NA
4 2000 NA
现在我想做这个(它是伪代码!):
if (ID=1 || ID=2)
{
years_practicing[corresponding cell]<-2017-grad_year
}
if (ID=3 || ID=4)
{
years_practicing[corresponding cell]<-2018-grad_year
}
实现这一目标:
ID grad_year years_practicing
1 1988 29
2 1970 47
3 1999 19
4 2000 18
我知道如何以程序方式进行(使用while 循环和if 语句),但我想以矢量化方式进行。
我试过这个(以及类似的变体):
year_2017_start<-c(1, 2)
year_2018_start<-c(3,4)
df$years_practicing[any(df$ID == year_2017_start)]<- 2017-df$grad_yr
df$years_practicing[any(df$ID == year_2018_start)]<- 2018-df$grad_yr
但是接收错误:
Error in df$years_practicing[any(df$ID == year_2017_start)] <- 2017 - :
replacement has length zero
> df$years_practicing[any(df$ID == year_2018_start)]<- 2018-df$grad_yr
Error in df$years_practicing[any(df$ID == year_2018_start)] <- 2018 - :
replacement has length zero
问题:
如何改进我的代码以使其正常工作。 (需要回答)
有没有更快的方法来获得类似的结果? (可选)
【问题讨论】:
-
df$years_practicing[which(df$ID == year_2017_start)]grad_year
-
@Cuan 你的代码就是我想要的。如果你想写答案,我会排除它。
标签: r dataframe vectorization data-cleaning