仅当 Z 列的第一个值包含 "X" 的值时,如何将新行添加到数据框的开头?

How to add new row into the beginning of data frame only if the first value of the column Z contains value of "X"?

我有大约一千个数据帧的列表。所有数据框都有 Z 列,该列主要由 NA 值组成,但只要有实际值,它就会包含“VALUE1”或“VALUE2”。例如:

weight | height | Z
---------------------------
62      100      NA
65      89       NA
59      88       randomnumbersVALUE1randomtext
66      92       NA
64      90       NA
64      87       randomnumbersVALUE2randomtext
57      84       NA

Z 列中每个数据框的第一个实际值应始终包含“VALUE1”值,因此在上面的示例数据框中,一切都是应该的。但是,如果数据框看起来像这样:

weight | height | Z
---------------------------
62      100      NA
65      89       NA
59      88       randomnumbersVALUE2randomtext
66      92       NA
64      90       NA
64      87       randomnumbersVALUE1randomtext
57      84       NA

我需要在数据框的开头添加一个新行,在 Z 列中添加“VALUE1”,在高度和重量列中添加值 0。我如何为我的数据框列表执行此操作(借助 add_row 和过滤器等功能)..?

library(dplyr)
dat %>%
  filter(!is.na(Z)) %>%
  slice(1) %>%
  mutate(across(weight:height, ~ 0)) %>%
  filter(!grepl("VALUE1", Z)) %>%
  mutate(Z = "VALUE1") %>%
  bind_rows(., dat)
#   weight height                             Z
# 1      0      0                        VALUE1
# 2     62    100                          <NA>
# 3     65     89                          <NA>
# 4     59     88 randomnumbersVALUE2randomtext
# 5     66     92                          <NA>
# 6     64     90                          <NA>
# 7     64     87 randomnumbersVALUE1randomtext
# 8     57     84                          <NA>

数据

dat <- structure(list(weight = c(62L, 65L, 59L, 66L, 64L, 64L, 57L), height = c(100L, 89L, 88L, 92L, 90L, 87L, 84L), Z = c(NA, NA, "randomnumbersVALUE2randomtext", NA, NA, "randomnumbersVALUE1randomtext", NA)), class = "data.frame", row.names = c(NA, -7L))

如果 dfs 是您的数据框列表,您可以这样做:

dfs = lapply(dfs, function(x) {
  if(grepl("VALUE2", x[!is.na(x$Z),"Z"][1])) {
    rbind(data.frame(weight=0,height=0,Z="VALUE1"),x)
  } else x
})