在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