我对R相当陌生.我已经搜索了好几个小时,并向对R有更多经验的同事寻求帮助,但仍然没有找到解决方案.我确实找到了一个related thread here,它提供了一些灵感,但我不知道如何扩展该方法来解决我的问题.

Overview

我有一个包含1800多个变量的数据集.问题是,该数据集包含两组140个变量,这些变量具有不同的数据,这些数据是在同一调查因自动化错误而在两个不同的时间点意外进行时创建的.数据库创建了同一变量的两个版本.我正在try 索引一个唯一的列,以判断该行的值是否为"NA",如果是,那么我想用第二组140列中的值填充它,并覆盖原始140列中的值.如果行不是"NA",那么我希望它保持原样.

Dummy Data Set

基于下面的虚拟集,我试图判断"week0date\u v2",看看它是否是给定行的NA值.如果是,则从"week0date"到"var3"的列中获取该行中的值,并将这些值写入"week0date\u v2"到"var3\u v2"的列中的同一行.如果给定行的值不是NA,则保留原始数据.

library('tidyverse')
dummy_data<- data.frame(
  id = c(1,2,3,4,5,6), 
  week0date_v2 = c("2022/2/1", NA, "2022/2/15", "2022/2/18", "2022/2/15", NA),
  var1_v2 = c(75,NA,66,NA,65,NA), 
  var2_v2 = c(19,NA,67,10,54,NA), 
  var3_v2 = c(NA,NA,99,125,73,NA),
  verify_v2 = c(1,NA,1,1,1,NA),
  week0date = c(NA, "2022/3/2", "2022/4/15", "2022/4/18", NA, "2022/4/15"),
  var1 = c(NA,52,NA,63,NA,75),
  var2 = c(NA,78,NA,NA,NA,63),
  var3 = c(15,64,25,NA,20,13),
  verify = c(NA,1,NA,1,NA,1)
)
dummy_data <- dummy_data %>% mutate_if(is.character, as.Date)

  id week0date_v2 var1_v2 var2_v2 var3_v2 verify_v2  week0date var1 var2 var3 verify
1  1   2022-02-01      75      19      NA         1       <NA>   NA   NA   15     NA
2  2         <NA>      NA      NA      NA        NA 2022-03-02   52   78   64      1
3  3   2022-02-15      66      67      99         1 2022-04-15   NA   NA   25     NA
4  4   2022-02-18      NA      10     125         1 2022-04-18   63   NA   NA      1
5  5   2022-02-15      65      54      73         1       <NA>   NA   NA   20     NA
6  6         <NA>      NA      NA      NA        NA 2022-04-15   75   63   13      1

Current Thinking

我try 了多种方法,但都没有成功.

我的同事和我首先try 将其用于单个变量(仅"week0date\u v2"列),我们可以使用下面的mutate()和case\u when()方法来实现这一点:

dummy_data_first_attempt <- dummy_data %>% 
  mutate(
    week0date_v2 = case_when(
      !is.na(week0date_v2) ~ week0date_v2, 
      is.na(week0date_v2) ~ week0date
    )) 

我不知道如何将上述方法扩展到"week0date\u v2"到"var3\u v2"的列范围内.我try 编写一个函数来实现这一点,但我编写函数的技能还不够.

如果您能帮助我们扩展以上内容,以达到以下预期效果,我们将不胜感激!!!

Desired Outcome

这就是我希望得到的结果(即,当"week0date\u v2"中的给定行为NA时,从"week0date"到"var3"的值被复制并粘贴到"week0date\u v2"到"var3\u v2"中……否则保留原始数据)

dummy_data_wrangled <- data.frame(
  id = c(1,2,3,4,5,6), 
  week0date_v2 = c("2022/2/1", "2022/3/2", "2022/2/15", "2022/2/18", "2022/2/15", "2022/4/15"),
  var1_v2 = c(75,52,66,NA,65,75), 
  var2_v2 = c(19,78,67,10,54,63), 
  var3_v2 = c(NA,64,99,125,73,13),
  verify_v2 = c(1,NA,1,1,1,NA),
  week0date = c(NA, "2022/3/2", "2022/4/15", "2022/4/18", NA, "2022/4/15"),
  var1 = c(NA,52,NA,63,NA,75),
  var2 = c(NA,78,NA,NA,NA,63),
  var3 = c(15,64,25,NA,20,13),
  verify = c(NA,1,NA,1,NA,1)
)
dummy_data_wrangled
  id week0date_v2 var1_v2 var2_v2 var3_v2 verify_v2 week0date var1 var2 var3 verify
1  1     2022/2/1      75      19      NA         1      <NA>   NA   NA   15     NA
2  2     2022/3/2      52      78      64        NA  2022/3/2   52   78   64      1
3  3    2022/2/15      66      67      99         1 2022/4/15   NA   NA   25     NA
4  4    2022/2/18      NA      10     125         1 2022/4/18   63   NA   NA      1
5  5    2022/2/15      65      54      73         1      <NA>   NA   NA   20     NA
6  6    2022/4/15      75      63      13        NA 2022/4/15   75   63   13      1

推荐答案

这是一种矢量化的base R方法-

replace_inds <- is.na(dummy_data$week0date_v2)
cols <- c('week0date', grep('^var\\d+$', names(dummy_data), value = TRUE))
cols_to_replace <- paste0(cols, '_v2')
dummy_data[replace_inds,cols_to_replace] <- dummy_data[replace_inds, cols]
dummy_data

#  id week0date_v2 var1_v2 var2_v2 var3_v2 verify_v2  week0date var1 var2 var3 verify
#1  1   2022-02-01      75      19      NA         1       <NA>   NA   NA   15     NA
#2  2   2022-03-02      52      78      64        NA 2022-03-02   52   78   64      1
#3  3   2022-02-15      66      67      99         1 2022-04-15   NA   NA   25     NA
#4  4   2022-02-18      NA      10     125         1 2022-04-18   63   NA   NA      1
#5  5   2022-02-15      65      54      73         1       <NA>   NA   NA   20     NA
#6  6   2022-04-15      75      63      13        NA 2022-04-15   75   63   13      1

请注意,此答案在很大程度上基于您拥有的数据的列名,因此请确保根据数据集对其进行调整.

下面是对代码的一些解释-

replace_indsweek0date_v2中的NA个值返回TRUE.TRUE个值是我们要替换的行.

replace_inds
#[1] FALSE  TRUE FALSE FALSE FALSE  TRUE

cols是我们要从week0date_v2中的NA中复制值的列的名称.

cols
#[1] "week0date" "var1"      "var2"      "var3"     

cols_to_replacecols中要替换为相应值的列.

cols_to_replace
#[1] "week0date_v2" "var1_v2"      "var2_v2"      "var3_v2"  

R相关问答推荐

当y大于阈值和值范围时,在时间序列中突出显示区域

如何对数据集进行逆向工程?

任意列的欧几里得距离

如何在R中合并和合并多个rabrame?

将文件保存到新文件夹时,切换r设置以不必创建目录

合并DFS列表并将索引提取为新列

如何使用ggplot对堆叠条形图进行嵌套排序?

在rpart. plot或fancyRpartPlot中使用带有下标的希腊字母作为标签?

2个Rscript.exe可执行文件有什么区别?

R中的哈密顿滤波

DEN扩展包中的RECT树形图出现异常行为

方法::slotName如何处理非类、非字符的参数?

使用R中的dist()迭代ID匹配的欧几里德距离

在R中,我如何使用滑动窗口计算位置,然后进行过滤?

如何平滑或忽略R中变量的微小变化?

将工作目录子文件夹中的文件批量重命名为顺序

如何构建一个for循环来循环处理动物ID?

变异以按组从其他列创建具有最大和最小值的新列

R没有按顺序显示我的有序系数?

以R表示的NaN值的IS.NA状态