我有这个数据框:
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"))
我想在 Onset
和 Offset
的每次出现之间用 列中的单词“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_ind
和offset_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/