如何根据条件在数据框中相互减去不同的列

时间:2019-09-14 14:18:47

标签: r

在我用于大学项目的数据框中,我必须从装修年份中减去true_date,如果房子从未进行过装修,则应从yr_built中减去。

这是一小段摘录

   yr_built yr_renovated  true_date
1      1995            0 2014-12-30
2      2006            0 2014-09-12
3      2008            0 2014-07-24
4      1973            0 2014-08-01
5      1998            0 2015-02-25
6      1971            0 2014-10-09
7      2004            0 2014-08-18
8      1954            0 2014-06-20
9      1977            0 2014-08-22
10     1968            0 2015-01-08
11     1924            0 2015-03-03
12     1953            0 2015-04-28
13     1941         1998 2014-08-14

我首先使用asDate将真实的日期转换为日期,然后将年份提取到名为yr_sold的对象中。

  House_Data$true_date <- as.Date(House_Data$true_date,na.mr=TRUE)
    yr_sold <-  as.numeric(format(House_Data$true_date, "%Y"))

即时通讯所卡住的部分是我该如何编写条件,以便当yr_renovated> 0时从yr_renovated中减去yr_sold或当yr_renovated <= 0时从yr_built中减去

for(i in 1:yr_sold) {
    if(House_Data$yr_renovated <= 0) {
        yr_since_renovations <- yr_sold - House_Data$yr_built
}   else {
        yr_since_renovations <- yr_sold-House_Data$yr_renovated
    }
}

这是我为它写的,它似乎起作用,但是R警告我有50个或更多警告。 关于此操作还有什么更好的建议吗?

summary(yr_since_renovations)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   19.00   42.00   43.11   62.00  115.00 

我们还必须创建yr_since_renovations的摘要,强烈暗示它有些奇怪,但我看不到任何东西,所以我很想知道我的代码是否有错误。

编辑

修复代码后,我发现需要删除2个负面结果。我看到yr_since_renovation中存在负值,并且导致yr_since_renovation的行需要从我的数据集中删除。

House_Data <- House_Data[!(years_since_renovation < 0),]

这是我尝试过的方法,它似乎确实删除了2个负值,但是当我运行years_since_renovation <- with(House_Data, true_date_year - ifelse(yr_renovated == 0, yr_built, yr_renovated))更新变量时,我收到此错误longer object length is not a multiple of shorter object length

1 个答案:

答案 0 :(得分:3)

true_date获取年份,并使用ifelse减去值

df$true_date <- as.Date(df$true_date)
df$true_date_year <- as.integer(format(df$true_date, "%Y"))
with(df, true_date_year - ifelse(yr_renovated == 0, yr_built, yr_renovated))
#[1] 19  8  6 41 17 43 10 60 37 47 91 62 16

数据

df <-  structure(list(yr_built = c(1995L, 2006L, 2008L, 1973L, 1998L, 
1971L, 2004L, 1954L, 1977L, 1968L, 1924L, 1953L, 1941L), yr_renovated = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1998L), true_date = structure(c(9L, 
7L, 2L, 3L, 11L, 8L, 5L, 1L, 6L, 10L, 12L, 13L, 4L), .Label = c("2014-06-20", 
"2014-07-24", "2014-08-01", "2014-08-14", "2014-08-18", "2014-08-22", 
"2014-09-12", "2014-10-09", "2014-12-30", "2015-01-08", "2015-02-25", 
"2015-03-03", "2015-04-28"), class = "factor")), class = "data.frame", 
row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"))
相关问题