繁体   English   中英

将 NA 插入 R 中的特定行和列

[英]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_bysummarise (在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM