Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于其他列中的值应用函数_R_Dplyr - Fatal编程技术网

R 基于其他列中的值应用函数

R 基于其他列中的值应用函数,r,dplyr,R,Dplyr,我有一个数据框架,每个唯一ID包含10个观察值和一些其他变量。不幸的是,数据中有一些特定列的缺失值(NA),我希望通过向前传递最后一个观察值(通过zoo包的NA.locf函数)来替换该列 问题是,我需要为每个唯一用户执行此函数,因此我需要为每个唯一ID“拆分”数据帧,然后应用此函数,同时保留所有其他列。我尝试了以下方法,但无效: df %>% group_by(ID) %>% group_split() %>% lapply(Location, na.locf()

我有一个数据框架,每个唯一ID包含10个观察值和一些其他变量。不幸的是,数据中有一些特定列的缺失值(NA),我希望通过向前传递最后一个观察值(通过zoo包的NA.locf函数)来替换该列

问题是,我需要为每个唯一用户执行此函数,因此我需要为每个唯一ID“拆分”数据帧,然后应用此函数,同时保留所有其他列。我尝试了以下方法,但无效:

df %>%
  group_by(ID) %>%
  group_split() %>%
  lapply(Location, na.locf() %>%
  bind_rows
数据集的可复制示例:

ID <- rep(1:5, each = 10)
Age <- sample(18:65, 50, replace = TRUE)
Locations <- c("Europe", "Asia", NA)
Location <- sample(Location, 50, replace = TRUE)
df <- data.frame(ID, Age, Location)

ID使用
group\u by
然后
na.locf
,使用
na.rm=FALSE
选项保持输出的长度:

library(dplyr)
df <- df %>% group_by(ID) %>% 
mutate(Location=zoo::na.locf(Location, na.rm=FALSE))
库(dplyr)
df%分组依据(ID)%>%
突变(Location=zoo::na.locf(Location,na.rm=FALSE))
正如Martin所评论的,如果序列以给定ID的缺失值开始,它将不会被填充。该脚本不会失败,即使该系列开始时缺少一个脚本。例如:

df <- tibble(ID=c(1, 1, 2, 2), Location=c(NA,"Europe","Asia",NA))
df %>% group_by(ID) %>% mutate(Location2=zoo::na.locf(Location, na.rm=FALSE))
df%groupby(ID)%%>%mutate(Location2=zoo::na.locf(Location,na.rm=FALSE))
返回:

# A tibble: 4 x 3
# Groups:   ID [2]
     ID Location Location2
  <dbl> <chr>    <chr>    
1     1 <NA>     <NA>     
2     1 Europe   Europe   
3     2 Asia     Asia     
4     2 <NA>     Asia     
#一个tible:4 x 3
#组别:ID[2]
ID位置位置2
1     1           
2.1欧洲
3.2亚洲
4.2亚洲

如果组中的第一个条目是“NA”,那么应该填写什么?`如果不分组,我建议
df%>%mutate(Location=NA.locf(Location))
。但是您的第一个元素没有前置元素。但是如果组的第一个元素是
NA
,则此操作将失败。实际上,它不使用
NA.rm=FALSE
选项:在这种情况下
NA.locf
保留长度。啊,我明白了。根据OP想要的输出,改进可能是
变异(Location=na.locf(na.locf(Location,na.rm=FALSE),fromLast=TRUE,na.rm=FALSE))
.TRUE!在这种情况下,更简洁的是
df%>%groupby(ID)%>%tidyr::fill(Location,.direction=“downup”)
zoo还有na.locf0(末尾有一个零),默认为na.rm=FALSE。