[英]Inserting NA's into specific rows and columns in R
这是我的 dataframe 的示例:
df3 <- data.frame(Frame = c(219388, 219389, 219390, 211387, 211388, 211389), Time = c("2020-06-05 13:26:39", "2020-06-05 13:26:39", "2020-06-05 13:26:39", "2020-06-05 13:26:39", "2020-06-05 13:26:39", "2020-06-05 13:26:39"),task = c("hop", "hop", "hop", "vj", "vj", "vj"), limb = c("L", "L", "L", "R", "R", "R"), trial = c("trial1", "trial1", "trial1", "trial2", "trial2", "trial2"))
我想将 NA 添加到 Frame 和 Time 列中的特定行(要添加的 NA 行的数量在我的真实数据集中会有所不同)。 我还需要相应地继续任务、肢体和试验列(即 hop、L、trial1 甚至在 NA 行上继续)。 我预期的 output 看起来像这样:
> df3
Frame Time task limb trial
219388 2020-06-05 13:26:39 hop L trial1
219389 2020-06-05 13:26:39 hop L trial1
219390 2020-06-05 13:26:39 hop L trial1
NA NA hop L trial1
NA NA hop L trial1
NA NA hop L trial1
211387 2020-06-05 13:26:39 vj R trial2
211388 2020-06-05 13:26:39 vj R trial2
211389 2020-06-05 13:26:39 vj R trial2
NA NA vj R trial2
NA NA vj R trial2
我已经尝试了 berryFunctions package 中的 insertRows,但是这会将整行更改为 NA,我需要任务、肢体和试验列才能继续。
insertRows(df3, r=c(3:5), new=NA, rcurrent=FALSE)
任何帮助或建议将不胜感激,谢谢!
我们可以根据 'task' 到 'trial' 列group_split
到 data.frames list
中,然后用map2
循环列表, slice
第一行,将 'Frame', 'Time' 转换为NA
,展开数据集行使用在map2
中传递的复制值进行uncount
,将数据集与原始数据集 ( bind_rows
) 绑定,当我们使用map2_dfr
时,它逐行返回单个 data.frame 绑定list
library(dplyr) #1.0.0
library(purrr)
library(tidyr)
df3 %>%
group_split(across(task:trial)) %>%
map2_dfr(c(3, 2), ~
slice(.x, 1) %>%
mutate(across(Frame:Time, ~NA)) %>%
uncount(.y) %>%
bind_rows(.x, .))
# A tibble: 11 x 5
# Frame Time task limb trial
# <dbl> <chr> <chr> <chr> <chr>
# 1 219388 2020-06-05 13:26:39 hop L trial1
# 2 219389 2020-06-05 13:26:39 hop L trial1
# 3 219390 2020-06-05 13:26:39 hop L trial1
# 4 NA <NA> hop L trial1
# 5 NA <NA> hop L trial1
# 6 NA <NA> hop L trial1
# 7 211387 2020-06-05 13:26:39 vj R trial2
# 8 211388 2020-06-05 13:26:39 vj R trial2
# 9 211389 2020-06-05 13:26:39 vj R trial2
#10 NA <NA> vj R trial2
#11 NA <NA> vj R trial2
group_split
类似于基本 R split
,只是它有一些选项可以将分组变量保留在 data.frames list
中(并且它不会命名list
元素)。 这个想法是在一个list
中拆分成块 data.frame ,其中分组列中的值相同。 因此,这是一种自动拆分数据集的方法,无需手动建议需要添加更多 NA 行的行。
此外,如果要添加的NAs
数量恒定,则另一个选项是group_by
, summarise
(在 dplyr 1.0.0 - summarise
可以返回多于 1 行)
df3 %>%
group_by(across(task:trial)) %>%
summarise(across(everything(), ~ c(., rep(NA, 3))))
# A tibble: 12 x 5
# Groups: task, limb, trial [2]
# task limb trial Frame Time
# <chr> <chr> <chr> <dbl> <chr>
# 1 hop L trial1 219388 2020-06-05 13:26:39
# 2 hop L trial1 219389 2020-06-05 13:26:39
# 3 hop L trial1 219390 2020-06-05 13:26:39
# 4 hop L trial1 NA <NA>
# 5 hop L trial1 NA <NA>
# 6 hop L trial1 NA <NA>
# 7 vj R trial2 211387 2020-06-05 13:26:39
# 8 vj R trial2 211388 2020-06-05 13:26:39
# 9 vj R trial2 211389 2020-06-05 13:26:39
#10 vj R trial2 NA <NA>
#11 vj R trial2 NA <NA>
#12 vj R trial2 NA <NA>
此外,使用berryFunctions
,在使用insertRows
创建NA
行后, fill
感兴趣的列
library(berryFunctions)
insertRows(df3, r=4:6, new=NA, rcurrent= FALSE) %>%
insertRows(., r = 10) %>%
fill(task:trial)
# Frame Time task limb trial
#1 219388 2020-06-05 13:26:39 hop L trial1
#2 219389 2020-06-05 13:26:39 hop L trial1
#3 219390 2020-06-05 13:26:39 hop L trial1
#4 NA <NA> hop L trial1
#5 NA <NA> hop L trial1
#6 NA <NA> hop L trial1
#7 211387 2020-06-05 13:26:39 vj R trial2
#8 211388 2020-06-05 13:26:39 vj R trial2
#9 211389 2020-06-05 13:26:39 vj R trial2
#10 NA <NA> vj R trial2
#11 NA <NA> vj R trial2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.