R:我想创建一个在特定日期后变为 1 的假人



我有一个看起来像这样的调查数据集。"年"、"月"和"日期"列记录了采访的进行日期,数据截至 2018 年 12 月 30 日:

| Year | Month | Date | USDollar |Governate|
|------|-------|------|----------|---------|
| 2018 |   6   |  10  |  38.50   |    11   |
| 2018 |   6   |  12  |  38.52   |    12   |
| 2018 |   6   |  14  |  38.61   |    10   |
| 2018 |   6   |  18  |  38.63   |    12   |
| 2018 |   6   |  21  |  38.63   |    13   |
| 2018 |   7   |  22  |  38.65   |    12   |
| 2018 |   7   |  23  |  39.41   |    13   |
| 2018 |   7   |  24  |  39.42   |    15   |
| 2018 |   7   |  02  |  39.43   |    12   |
| 2018 |   7   |  03  |  39.50   |    13   |

等等。我想做的是创建一个虚拟变量,如果日期在 10 月 7 日之后,则为 1,如果日期在 10 月 7 日之前,则为 0。我想称这个变量为"post_float"。

我尝试使用此命令df$post_float <- ifelse(df$month >= 10 & df$date >= 7, 1, 0)但这并没有完全做到。在大多数情况下没关系,但它会弄乱一些日期(例如,11 月 5 日,因为这不符合命令要求(。如何设置虚拟人,使其在 10 月 7 日变为 1 并保持这种状态,直到数据集结束?

感谢您的帮助,很抱歉,如果我错过了任何明显的东西,我是 R 的新手。

你可以试试这个:

#Data
Data <- structure(list(Year = c(2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L), Month = c(6L, 6L, 6L, 6L, 6L, 7L, 
7L, 7L, 7L, 7L), Date = c(10L, 12L, 14L, 18L, 21L, 22L, 23L, 
24L, 2L, 3L), USDollar = c(38.5, 38.52, 38.61, 38.63, 38.63, 
38.65, 39.41, 39.42, 39.43, 39.5), Governate = c(11L, 12L, 10L, 
12L, 13L, 12L, 13L, 15L, 12L, 13L)), row.names = c(NA, -10L), class = "data.frame")
#Date
Data$FormatedDate <- as.Date(paste0(Data$Year,'-',Data$Month,'-',Data$Date),'%Y-%m-%d') 
#Variable
Data$post_float <- ifelse(Data$FormatedDate>as.Date('2018-10-07'),1,0)
Year Month Date USDollar Governate FormatedDate post_float
1  2018     6   10    38.50        11   2018-06-10          0
2  2018     6   12    38.52        12   2018-06-12          0
3  2018     6   14    38.61        10   2018-06-14          0
4  2018     6   18    38.63        12   2018-06-18          0
5  2018     6   21    38.63        13   2018-06-21          0
6  2018     7   22    38.65        12   2018-07-22          0
7  2018     7   23    39.41        13   2018-07-23          0
8  2018     7   24    39.42        15   2018-07-24          0
9  2018     7    2    39.43        12   2018-07-02          0
10 2018     7    3    39.50        13   2018-07-03          0

日期的列结构建议使用ISOdate

d <- transform(d, 
post_float=+(do.call("ISOdate", unname(d[1:3])) > 
ISOdate(2018, 10, 07)))
d
#    Year Month Date USDollar Governate post_float
# 1  2018     6   10    38.50        11          0
# 2  2018     6   12    38.52        12          0
# 3  2018     7   22    38.65        12          0
# 4  2018     7   23    39.41        13          0
# 5  2018     8   24    39.42        15          0
# 6  2018     9    2    39.43        12          0
# 7  2018    10    6    39.50        13          0
# 8  2018    10    7    39.50        13          0
# 9  2018    10    8    39.50        13          1
# 10 2018    10    9    39.50        13          1
<小时 />

数据:

d <- structure(list(Year = c(2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L), Month = c(6L, 6L, 7L, 7L, 8L, 9L, 
10L, 10L, 10L, 10L), Date = c(10L, 12L, 22L, 23L, 24L, 2L, 6L, 
7L, 8L, 9L), USDollar = c(38.5, 38.52, 38.65, 39.41, 39.42, 39.43, 
39.5, 39.5, 39.5, 39.5), Governate = c(11L, 12L, 12L, 13L, 15L, 
12L, 13L, 13L, 13L, 13L)), class = "data.frame", row.names = c(NA, 
-10L))

最新更新