[英]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.