在R中,用最常用的值替换值
我有一个带有时间和传输模式的数据帧。有一些值在行走部分被分类为“未知”或假分类为其他运输模式,例如“汽车” 结构如下在R中,用最常用的值替换值,r,dataframe,mutate,R,Dataframe,Mutate,我有一个带有时间和传输模式的数据帧。有一些值在行走部分被分类为“未知”或假分类为其他运输模式,例如“汽车” 结构如下 travel <- structure(list(time = structure(1:19, .Label = c("16:20:20", "16:20:21", "16:20:22", "16:20:23", "16:20:24", "16:20:25&quo
travel <- structure(list(time = structure(1:19, .Label = c("16:20:20",
"16:20:21", "16:20:22", "16:20:23", "16:20:24", "16:20:25", "16:20:26",
"16:20:27", "16:20:28", "16:20:29", "16:20:30", "16:20:31", "16:20:32",
"16:20:33", "16:20:34", "16:20:35", "16:20:36", "16:20:37", "16:20:38"
), class = "factor"), mode = structure(c(3L, 3L, 3L, 2L, 2L,
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L), .Label = c("car",
"bus stop", "walk"), class = "factor")), class = "data.frame", row.names = c(NA,
-19L))
我想替换不正确的值。在数据示例中,观测值4、5和7必须分类为“行走”
我想到一个变异函数,它观察观察到的前后值。如果“未知”值前后的值是相同的模式(例如:行走),则未知值被分类为“行走”。此外,观察结果7不知何故被归类为“行走”
谢谢你的帮助 第一步可能是将
模式
的“未知”更改为NA,并使用zoo::NA.locf
填写前面的非NA值(如果需要)
其次,例如,您可以将另一个模式
的单个匹配项定义为要替换的内容,再次使用前面的已知值。您可以使用rle
查找此类案例
df5 16:20:24步行
#>6:16:20:25步行
#>7:16:20:26步行
#>8:16:20:27步行
#>9:16:20:28步行
#>10:16:20:29步行
#>11:16:20:30步行
#>12:16:20:31步行
#>13:16:20:32步行
#>14:16:20:33步行
#>15:16:20:34汽车
#>16:20:35汽车
#>17:16:20:36汽车
#>18:16:20:37汽车
#>19:16:20:38汽车
由(v1.0.0)于2021年3月23日创建
或者,更简洁地说,将两个条件结合在一起:
图书馆(动物园)
rdf第一步可能是将模式
的“未知”更改为NA,并使用zoo::NA.locf
填充前面的非NA值,如果这是您想要的
其次,例如,您可以将另一个模式
的单个匹配项定义为要替换的内容,再次使用前面的已知值。您可以使用rle
查找此类案例
df5 16:20:24步行
#>6:16:20:25步行
#>7:16:20:26步行
#>8:16:20:27步行
#>9:16:20:28步行
#>10:16:20:29步行
#>11:16:20:30步行
#>12:16:20:31步行
#>13:16:20:32步行
#>14:16:20:33步行
#>15:16:20:34汽车
#>16:20:35汽车
#>17:16:20:36汽车
#>18:16:20:37汽车
#>19:16:20:38汽车
由(v1.0.0)于2021年3月23日创建
或者,更简洁地说,将两个条件结合在一起:
图书馆(动物园)
rdf稍微更改了您的样本数据
travel <- structure(list(time = structure(1:19, .Label = c("16:20:20",
"16:20:21", "16:20:22", "16:20:23", "16:20:24", "16:20:25", "16:20:26",
"16:20:27", "16:20:28", "16:20:29", "16:20:30", "16:20:31", "16:20:32",
"16:20:33", "16:20:34", "16:20:35", "16:20:36", "16:20:37", "16:20:38"
), class = "factor"), mode = structure(c(3L, 3L, 3L, 2L, 2L,
3L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 1L, 1L, 1L, 1L, 1L), .Label = c("car",
"unknown", "walk"), class = "factor")), class = "data.frame", row.names = c(NA,
-19L))
travel
time mode
1 16:20:20 walk
2 16:20:21 walk
3 16:20:22 walk
4 16:20:23 unknown
5 16:20:24 unknown
6 16:20:25 walk
7 16:20:26 car
8 16:20:27 walk
9 16:20:28 walk
10 16:20:29 walk
11 16:20:30 walk
12 16:20:31 walk
13 16:20:32 walk
14 16:20:33 unknown
15 16:20:34 car
16 16:20:35 car
17 16:20:36 car
18 16:20:37 car
19 16:20:38 car
travel%group\u by(d=rleid(模式))%>%
突变(d2=n())%%>%ungroup()%%>%
当(d2==1&lag(mode)==lead(mode)~lag(mode)时,改变(mode=case_),
d2==2和第一(模式[d])==first(模式[d-1])~first(模式[d-1]),
真~模式))%>%
选择(-d,-d2)
#一个tibble:19x2
时间模式
1 16:20:20步行
2 16:20:21步行
3 16:20:22步行
4 16:20:23步行
5 16:20:24步行
6:16:20:25步行
7:16:20:26步行
8:16:20:27步行
9:16:20:28步行
10:16:20:29步行
11:16:20:30步行
12:16:20:31步行
13:16:20:32步行
14 16:20:33未知
15:16:20:34汽车
16:20:35汽车
17:16:20:36汽车
18:16:20:37汽车
19:16:20:38汽车
稍微更改了示例数据
travel <- structure(list(time = structure(1:19, .Label = c("16:20:20",
"16:20:21", "16:20:22", "16:20:23", "16:20:24", "16:20:25", "16:20:26",
"16:20:27", "16:20:28", "16:20:29", "16:20:30", "16:20:31", "16:20:32",
"16:20:33", "16:20:34", "16:20:35", "16:20:36", "16:20:37", "16:20:38"
), class = "factor"), mode = structure(c(3L, 3L, 3L, 2L, 2L,
3L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 1L, 1L, 1L, 1L, 1L), .Label = c("car",
"unknown", "walk"), class = "factor")), class = "data.frame", row.names = c(NA,
-19L))
travel
time mode
1 16:20:20 walk
2 16:20:21 walk
3 16:20:22 walk
4 16:20:23 unknown
5 16:20:24 unknown
6 16:20:25 walk
7 16:20:26 car
8 16:20:27 walk
9 16:20:28 walk
10 16:20:29 walk
11 16:20:30 walk
12 16:20:31 walk
13 16:20:32 walk
14 16:20:33 unknown
15 16:20:34 car
16 16:20:35 car
17 16:20:36 car
18 16:20:37 car
19 16:20:38 car
travel%group\u by(d=rleid(模式))%>%
突变(d2=n())%%>%ungroup()%%>%
当(d2==1&lag(mode)==lead(mode)~lag(mode)时,改变(mode=case_),
d2==2和第一(模式[d])==first(模式[d-1])~first(模式[d-1]),
真~模式))%>%
选择(-d,-d2)
#一个tibble:19x2
时间模式
1 16:20:20步行
2 16:20:21步行
3 16:20:22步行
4 16:20:23步行
5 16:20:24步行
6:16:20:25步行
7:16:20:26步行
8:16:20:27步行
9:16:20:28步行
10:16:20:29步行
11:16:20:30步行
12:16:20:31步行
13:16:20:32步行
14 16:20:33未知
15:16:20:34汽车
16:20:35汽车
17:16:20:36汽车
18:16:20:37汽车
19:16:20:38汽车
如果第7行的车辆无效,为什么第15到19行的车辆无效?此外,哪些是有效值,哪些是无效值?有什么标准来决定这些吗?第7行是无效的,因为它被我的Algortim分类错误->对于GPS的行走噪音来说,平均速度太高了。第15-19行是正确的,因为步行->根据地理信息,其平均速度(滚动平均值)为高。标准为,例如,在50行范围内,从运输模式步行到汽车仅需1或2秒的改变是不现实的。如果未知的两侧都是不同的有效值,该怎么办?你怎么说“未知的两侧”?走陌生的车?那么它应该被标记为未知。如果第7行的车是无效的,为什么第15到19行的车不是呢?此外,哪些是有效值,哪些是无效值?有什么标准来决定这些吗?第7行是无效的,因为它被我的Algortim分类错误->对于GPS的行走噪音来说,平均速度太高了。第15-19行是正确的,因为步行->根据地理信息,其平均速度(滚动平均值)为高。标准为,例如,在50行范围内,从运输模式步行到汽车仅需1或2秒的改变是不现实的。如果未知的两侧都是不同的有效值,该怎么办?你怎么说“未知的两侧”?走陌生的车?然后应将输入标记为unknown.thx。在我的数据(超过1000万)中,行绝对是“真实”NA值。您是否建议为真实NA值指定另一个表达式?如果您希望将它们保留为NA,可以在执行NA.locf
操作之前暂时重命名它们,并在以后将它们设置回NA(如果您喜欢).thx以获取帮助.thx以获取输入)。在我的数据(超过1000万)中,行绝对是“真实”NA值。你会建议给真实的NA值另一个表达式吗?如果你想保留它们为NA,你可以暂时
library(data.table)
travel %>% group_by(d = rleid(mode)) %>%
mutate(d2 = n()) %>% ungroup() %>%
mutate(mode = case_when( d2 == 1 & lag(mode) == lead(mode) ~ lag(mode),
d2 == 2 & first(mode[d]) == first(mode[d-1]) ~ first(mode[d-1]),
TRUE ~ mode)) %>%
select(-d, -d2)
# A tibble: 19 x 2
time mode
<fct> <fct>
1 16:20:20 walk
2 16:20:21 walk
3 16:20:22 walk
4 16:20:23 walk
5 16:20:24 walk
6 16:20:25 walk
7 16:20:26 walk
8 16:20:27 walk
9 16:20:28 walk
10 16:20:29 walk
11 16:20:30 walk
12 16:20:31 walk
13 16:20:32 walk
14 16:20:33 unknown
15 16:20:34 car
16 16:20:35 car
17 16:20:36 car
18 16:20:37 car
19 16:20:38 car