繁体   English   中英

有条件地创建数据框列表中的字段 r

[英]Conditional creation of fields in a list of dataframes r

我有一个包含数据框的列表,想测试数据框是否包含某些字段; 如果不应该创建这些字段(作为空白字段),当该字段存在时,它应该什么都不做(保持值不变)。

例子:

List1 <- list(
  DF1 = data.frame("x"=c("A","B","C"),
             "y"=c("D","E","F"),
             "z"=c("G","H","I" )
             ),
  DF2 = data.frame("t"=c("K","L","M"),
                   "y"=c("D","E","F"),
                   "z"=c("G","H","I" )
  )
) 

在这些数据帧上,我想测试字段“s”和“t”是否存在。 应在 DF1 和 DF2 中创建字段“s”,应仅在 DF1 中创建字段“t”。

我尝试创建单独的函数(一个用于“s”,一个用于“t”,但无法使其正常工作。此外,我想知道我是否可以在一个函数中完成所有测试。请参阅下面的结构我试过的功能(对于“s”)

Existence_col_s <- function(id) {
  if( !("s" %in% colnames(id)))
    mutate(id, s = "")
  else {do nothing}
}

List2 <- lapply(List1, c(Existence_col_s, Existence_col_t))

有任何想法吗?

辅助函数有条件地向 data.frame 添加一列:

library(tidyverse)
add_column = function(df, col) {
  if (!col %in% names(df)) df[[col]] = ''
  df
}

将此函数应用于 List1 的每个元素两次:

map(List1, function(df) {
  df %>% add_column('s') %>% add_column('t')
})

这是一个基本的解决方案:

检查和添加列的回调:

checkAdd <- function(df,cols) {
  for(col in cols) {
    if(is.null(df[[col]])) df[[col]] <- ''
  }
  return(df)
}

你的手机:

lapply(List1, checkAdd, cols= c('s','t'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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