r - 填充列中两个值之间的行

标签 r dplyr

我有这个数据框:

    df<-structure(list(StimulusName = c("Alpha5", "Alpha5", "Alpha5", 
"Alpha5", "Alpha5", "Alpha5", "Alpha5", "Alpha5", "Alpha5", "Alpha5", 
"Alpha5", "Alpha5", "Alpha5", "Alpha5", "Alpha5", "Alpha5", "Alpha5", 
"Alpha5", "Alpha5", "Alpha5", "Alpha5", "Alpha5", "Alpha5", "Alpha5", 
"Alpha5", "Alpha5", "Alpha5", "Alpha5", "Alpha5", "Alpha5", "Alpha5", 
"Alpha5", "Alpha5"), Label = c(NA, NA, NA, NA, NA, "Onset", NA, 
NA, NA, NA, NA, "Offset", NA, NA, NA, NA, NA, NA, NA, "Onset", 
NA, NA, NA, NA, NA, NA, NA, NA, "Offset", NA, NA, NA, NA)), row.names = c(NA, 
-33L), class = c("tbl_df", "tbl", "data.frame"))

我想在 OnsetOffset 的每次出现之间用 列中的单词“Onset”填充行>标签。最终的数据框如下所示:

    StimulusName Label
1   Alpha5       NA
2   Alpha5       NA
3   Alpha5       NA
4   Alpha5       NA
5   Alpha5       NA
6   Alpha5       Onset
7   Alpha5       Onset
8   Alpha5       Onset
9   Alpha5       Onset
10  Alpha5       Onset
11  Alpha5       Onset
12  Alpha5       Offset
13  Alpha5       NA
14  Alpha5       NA
15  Alpha5       NA
16  Alpha5       NA
17  Alpha5       NA
18  Alpha5       NA
19  Alpha5       NA
20  Alpha5       Onset
21  Alpha5       Onset
22  Alpha5       Onset
23  Alpha5       Onset
24  Alpha5       Onset
25  Alpha5       Onset
26  Alpha5       Onset
27  Alpha5       Onset
28  Alpha5       Onset
29  Alpha5       Offset
30  Alpha5       NA
31  Alpha5       NA
32  Alpha5       NA
33  Alpha5       NA

这可以在 dplyr 中使用 fill() 实现吗?

此代码显然不起作用,因为它会在第一个非 NA 值之后填充所有内容:

Test <- df%>% 
  fill(df$Label)

我对任何解决方案持开放态度,但更愿意使用 dplyr 并尽可能避免循环。

最佳答案

我们可以使用 base R mapply

#Get "Onset" indices
onset_ind <- which(df$Label == "Onset")

#Get "Offset" indices
offset_ind <- which(df$Label == "Offset")

#Create a sequence of indices between onset and offset and change their value
df$Label[unlist(mapply(function(x, y) x:y, onset_ind, offset_ind - 1))] <- "Onset"

df
#   StimulusName  Label
#1        Alpha5   <NA>
#2        Alpha5   <NA>
#3        Alpha5   <NA>
#4        Alpha5   <NA>
#5        Alpha5   <NA>
#6        Alpha5  Onset
#7        Alpha5  Onset
#8        Alpha5  Onset
#9        Alpha5  Onset
#10       Alpha5  Onset
#11       Alpha5  Onset
#12       Alpha5 Offset
#13       Alpha5   <NA>
#14       Alpha5   <NA>
#.....

这里假设“Onset”和“Offset”出现的次数相同。


如果您想避免不必要的变量创建(onset_indoffset_ind),您可以在一行中执行此操作

df$Label[unlist(mapply(function(x, y) x:y, 
      which(df$Label == "Onset"), which(df$Label == "Offset") - 1))] <- "Onset"

关于r - 填充列中两个值之间的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53113858/

相关文章:

r - 函数中的 dplyr 管道

r - 基于R中的日期列创建具有重复值的新数据框

r - 如何在 R 中制作可变宽度直方图,标签与 bin 边缘对齐?

r - 将多个功能应用于数据框的每一行

将 NA 的值替换为不同列中的先前值和当前值的总和

R dplyr 删除可能存在也可能不存在的列 select(-name)

r - 带 dplyr 的条件 rowMeans

R - 如何为唯一组序列的缺失值添加行?

R通过添加空格格式化整数

r - 如何在具有多个因素的直方图上放置曲线?