R 需要帮助创建一个函数来删除一个数据波(如果是';这是前一波的翻版,用于回顾性测量

R 需要帮助创建一个函数来删除一个数据波(如果是';这是前一波的翻版,用于回顾性测量,r,function,dataframe,duplicates,data.table,R,Function,Dataframe,Duplicates,Data.table,我正在使用一个纵向数据集,该数据集对创伤进行了回顾性测量,如果答案为“是”,则提供对某个问题的肯定/否定,以及发病年龄。如果一个问题在第一波数据中获得批准,然后在第二波数据中再次获得相同年龄的批准,则需要将其转换为“否”,并将年龄转换为NA。我的数据如下所示: df <- as.data.frame(cbind(Aw1 = c(0,0,1,0,0), Aagew1 = c(NA,NA,23,NA,NA),

我正在使用一个纵向数据集,该数据集对创伤进行了回顾性测量,如果答案为“是”,则提供对某个问题的肯定/否定,以及发病年龄。如果一个问题在第一波数据中获得批准,然后在第二波数据中再次获得相同年龄的批准,则需要将其转换为“否”,并将年龄转换为NA。我的数据如下所示:

df <- as.data.frame(cbind(Aw1 = c(0,0,1,0,0),
                          Aagew1 = c(NA,NA,23,NA,NA),
                          Aw2 = c(1,0,1,0,0),
                          Aagew2 = c(29,NA,23,NA,NA),
                          Bw1 = c(1,0,0,0,1),
                          Bagew1 = c(20,NA,NA,NA,23),
                          Bw2 = c(1,0,1,0,1),
                          Bagew2 = c(20,NA,28,NA,23)))
print(df)
  Aw1 Aagew1 Aw2 Aagew2 Bw1 Bagew1 Bw2 Bagew2
1   0     NA   1     29   1     20   1     20
2   0     NA   0     NA   0     NA   0     NA
3   1     23   1     23   0     NA   1     28
4   0     NA   0     NA   0     NA   0     NA
5   0     NA   0     NA   1     23   1     23

谢谢你帮助我

可以稍微修改OP的函数,添加
get
返回值

rm.duplicate <- function(x){
  y <- as.data.table(x)
  for(i in LETTERS[1:2]){
      y[get(paste0(i,"age","w1")) == get(paste0(i,"age","w2")), 
           paste0(i,c("", "age"), "w2")  := .(0,  NA)]
    }
   return(as.data.frame(y))
 }

rm.duplicate(df)
#  Aw1 Aagew1 Aw2 Aagew2 Bw1 Bagew1 Bw2 Bagew2
#1   0     NA   1     29   1     20   0     NA
#2   0     NA   0     NA   0     NA   0     NA
#3   1     23   0     NA   0     NA   1     28
#4   0     NA   0     NA   0     NA   0     NA
#5   0     NA   0     NA   1     23   0     NA
rm.duplicate <- function(x){
  y <- as.data.table(x)
  for(i in LETTERS[1:2]){
    y[paste0(i,"age","w1") == paste0(i,"age","w2"), ':=' (paste0(i,"w2") = 0, paste0(i,"age","w2") = NA)]
  }
  return(as.data.frame(y))
}
Aw1 Aagew1 Aw2 Aagew2 Bw1 Bagew1 Bw2 Bagew2
1:   0     NA   1     29   1     20   0     NA
2:   0     NA   0     NA   0     NA   0     NA
3:   1     23   0     NA   0     NA   1     28
4:   0     NA   0     NA   0     NA   0     NA
5:   0     NA   0     NA   1     23   0     NA
rm.duplicate <- function(x){
  y <- as.data.table(x)
  for(i in LETTERS[1:2]){
      y[get(paste0(i,"age","w1")) == get(paste0(i,"age","w2")), 
           paste0(i,c("", "age"), "w2")  := .(0,  NA)]
    }
   return(as.data.frame(y))
 }

rm.duplicate(df)
#  Aw1 Aagew1 Aw2 Aagew2 Bw1 Bagew1 Bw2 Bagew2
#1   0     NA   1     29   1     20   0     NA
#2   0     NA   0     NA   0     NA   0     NA
#3   1     23   0     NA   0     NA   1     28
#4   0     NA   0     NA   0     NA   0     NA
#5   0     NA   0     NA   1     23   0     NA
dt <- as.data.table(df)
 for(i in LETTERS[1:2]){
   w1 <- paste0(i,"age","w1")
   w2 <- paste0(i,"age","w2")
   i1 <- which(dt[[w1]] == dt[[w2]])
   nm1 <- paste0(i,c("", "age"), "w2")
   set(dt, i = i1, j = nm1[1], value = 0)
   set(dt, i = i1, j = nm1[2], value = NA)

 }

dt