R 用向量中最后一个非空值填充空值

R 用向量中最后一个非空值填充空值,r,vector,R,Vector,我想用前面的值在向量中填充缺少的值(不是NA,只是'!)。例如,如果我有一个向量定义为 vec <- c('Titanic', '', '', '', 'Donnie Darko', '', '', 'Twin Peaks', 'American Hustle', '') 如何实现这一点?这里有一个带有nzchar和子集的两行程序,应该非常有效 # get logical vector of elements with non-empty character elem

我想用前面的值在向量中填充缺少的值(不是
NA
,只是
'
!)。例如,如果我有一个向量定义为

vec <- c('Titanic', '', '', '', 'Donnie Darko', '', '', 'Twin Peaks', 
         'American Hustle', '')

如何实现这一点?

这里有一个带有
nzchar
和子集的两行程序,应该非常有效

# get logical vector of elements with non-empty character elements
notMissings <- nzchar(movies)
# fill in missing values
movies[notMissings][cumsum(notMissings)]
 [1] "Titanic"         "Titanic"         "Titanic"         "Titanic"        
 [5] "Donnie Darko"    "Donnie Darko"    "Donnie Darko"    "Twin Peaks"     
 [9] "American Hustle" "American Hustle"
请注意,如果第一个元素是空字符“”,则第二个方法将引发错误

数据

movies <- c('Titanic', '', '', '', 'Donnie Darko', '', '', 'Twin Peaks',
            'American Hustle', '')

movies在基本R中使用
Reduce
,其中
vec
是您的向量:

Reduce(function(x,y) ifelse(y=="", x, y), vec, accumulate=TRUE)

#[1] "Titanic"       "Titanic"       "Titanic"       "Titanic"         #"Donnie Darko"   
#[6] "Donnie Darko"  "Donnie Darko"  "Twin Peaks"    "American Hustle" #"American Hustle"

或者我们可以使用
zoo
中的
na.locf

library(zoo)
vec <- c('Titanic', '', '', '', 'Donnie Darko', '', '', 'Twin Peaks', 'American Hustle', '')
vec[which(vec == "")] <- NA
na.locf(vec)

#  [1] "Titanic"         "Titanic"         "Titanic"         "Titanic" "Donnie Darko"    "Donnie Darko" 
#  [7] "Donnie Darko"    "Twin Peaks"      "American Hustle" "American Hustle"
图书馆(动物园)
vec我们也可以使用

unlist(tapply(movies, cumsum(movies !=""), FUN = 
      function(x) rep(x[1], length(x))), use.names = FALSE)
#[1] "Titanic"         "Titanic"         "Titanic"         "Titanic"         "Donnie Darko"    "Donnie Darko"    "Donnie Darko"    "Twin Peaks"     
#[9] "American Hustle" "American Hustle"
数据
电影最简单的方法是循环播放。这就是我最后经常做的事情,但可能有更聪明的方法。回答得好,我喜欢你提供了两种方法来解决这个问题。谢谢。这是
Reduce
的巧妙用法。这也很有效,巧妙地使用
Reduce
!谢谢。谢谢你的补充回答!我也尝试过,但这会导致向量中出现
NA
s时出现问题。添加了
which()
,以避免NAs出现问题
library(zoo)
vec <- c('Titanic', '', '', '', 'Donnie Darko', '', '', 'Twin Peaks', 'American Hustle', '')
vec[which(vec == "")] <- NA
na.locf(vec)

#  [1] "Titanic"         "Titanic"         "Titanic"         "Titanic" "Donnie Darko"    "Donnie Darko" 
#  [7] "Donnie Darko"    "Twin Peaks"      "American Hustle" "American Hustle"
unlist(tapply(movies, cumsum(movies !=""), FUN = 
      function(x) rep(x[1], length(x))), use.names = FALSE)
#[1] "Titanic"         "Titanic"         "Titanic"         "Titanic"         "Donnie Darko"    "Donnie Darko"    "Donnie Darko"    "Twin Peaks"     
#[9] "American Hustle" "American Hustle"
movies <- c('Titanic', '', '', '', 'Donnie Darko', '', '', 'Twin Peaks', 
          'American Hustle', '')