【问题标题】:Creating data.frame in in R by comparing values with list通过将值与列表进行比较在 R 中创建 data.frame
【发布时间】:2023-01-27 22:20:01
【问题描述】:

我正在尝试通过将其观察值与列表值进行比较来转换 R 中的 data.frame。这意味着如果列表显示:“'1' 是正确的。”那么所有其他值都应该是错误的或 N.A.

例如,我创建了一个 data.frame,其中包含 3 个不同的变量,用于 3 个观察:

dat <- data.frame("Q" = c("a", "b", "a"),
                  "P" = c(1, 2, 4),
                  "R" = c("d", NA, "d"))

对于每个变量,我都定义了一个正确的答案并将它们写在一个列表中:

results <- list("a", 2, "d")

所以对于变量只要一种是正确的,因为P只要2个因此d是正确答案R.因为我想用虚拟变量创建一个数据集,结果应该是这样的:

      [,1]  [,2]  [,3] 
[1,] "Yes" "No"  "Yes"
[2,] "No"  "Yes" "No" 
[3,] "Yes"  NA   "Yes"

我试图创建一个循环,但结果不如预期:

mylist <- list()


for (j in 1:3) {
  vec <- character(3)
  for (i in 1:3) {
    ifelse(dat[i,j] == results[j], vec[j] <- "Yes",
           ifelse((is.na(dat[i,j]) == TRUE), vec[j] <- NA, vec[j] <- "No"))
  }
  mylist[[j]] <- vec
}

df <- do.call("rbind",mylist)
     [,1]  [,2] [,3] 
[1,] "Yes" ""   ""   
[2,] ""    "No" ""   
[3,] ""    ""   "Yes"

我非常感谢您的所有回答 :)

【问题讨论】:

  • apply(dat,1,FUN = \(x) x==results) 为您提供了一个有用的起点。

标签: r dataframe loops if-statement transformation


【解决方案1】:
mapply(`==`, dat, results)

         Q     P    R
[1,]  TRUE FALSE TRUE
[2,] FALSE  TRUE   NA
[3,]  TRUE FALSE TRUE

或者,要获得预期的输出,请使用 t

t(mapply(`==`, dat, results))

   [,1]  [,2]  [,3]
Q  TRUE FALSE  TRUE
P FALSE  TRUE FALSE
R  TRUE    NA  TRUE

【讨论】:

    【解决方案2】:
    out <- apply(dat,1,FUN = (x) x==results)
    
    out2 <- out
    out2[out] <- "Yes"
    out2[!out] <- "No"
    

    > out2
      [,1]  [,2]  [,3] 
    Q "Yes" "No"  "Yes"
    P "No"  "Yes" "No" 
    R "Yes" NA    "Yes"
    

    【讨论】:

    • 请注意,这是一种笨拙的手动方法,将会有一种不使用中间对象等的更优雅的方法。
    【解决方案3】:

    这是一个 dplyr 解决方案:

    library(dplyr)
    
    dat %>% 
      mutate(across(everything(), ~case_when(. %in% results ~ "yes",
                                                !(. %in% results) ~ "no",
                                                TRUE ~ NA_character_)))
    
        Q   P   R
    1 yes  no yes
    2  no yes  no
    3 yes  no yes
    

    【讨论】:

      猜你喜欢
      • 2013-02-07
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多