首页 > 解决方案 > 如何创建一个函数来根据 R 中不同数据框中的值生成新变量

问题描述

我想创建一个这样的函数(显然不是正确的代码):

forEach ID in DATAFRAME1 look at each row with ID in DATAFRAME2 {
  if DATAFRAME2$VARIABLE1 = something { 
    DATAFRAME1$VARIABLE1 = TRUE; 
    DATAFRAME1$VARIABLE2 = DATAFRAME2$VARIABLE2
  }
}

在纯文本中,我有一个个人列表和一个包含这些个人混合信息的数据库。假设DATAFRAME2包含有关已阅读书籍的信息c(id, title, author, date)。我想创建一个新变量,DATAFRAME1其中包含一个布尔值,即个人是否已阅读特定书籍(VARIABLE1上)以及他们第一次阅读它的日期(VARIABLE2上)。此外,添加第三个读取次数的变量会很有趣,但不是必需的。

我以前在R中没有真正做到这一点,主要是做基本的统计数据和与dplyr的基本争论。我想我可以使用dplyr并加入,但这感觉是一种更好的方法。任何让我开始的帮助将不胜感激。

标签: rdatabasedataframe

解决方案


以下函数执行问题所要求的。它的论点是

  1. DF1DF2具有明显的含义;
  2. var1并且var2VARIABLE1并且VARIABLE2在问题中;
  3. value是 的值something

测试数据在最后。

fun <- function(DF1, DF2, ID = 'ID', var1, var2, value){
  DF1[[var1]] <- NA
  DF1[[var2]] <- NA
  k <- DF2[[var1]] == value
  for(id in df1[[ID]]){
    i <- DF1[[ID]] == id
    j <- DF2[[ID]] == id
    if(any(j & k)){
      DF1[[var1]][i] <- TRUE
      DF1[[var2]][i] <- DF2[[var2]][j & k]
    }
  }
  DF1
}



fun(df1, df2, value = 4, var1 = 'X', var2 = 'Y')
#  ID    X  Y
#1  a   NA NA
#2  d TRUE 19

测试数据。

set.seed(1234)

df1 <- data.frame(ID = c("a", "d"))
df2 <- data.frame(ID = rep(letters[1:5], 4), 
                  X = sample(20, 20, TRUE),
                  Y = sample(20))

推荐阅读