在我用于大学项目的数据框中,我必须从装修年份中减去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
答案 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"))