如何在R中创建统计字符数的新列并将缺失值设为0?
问题与解决方案
问题描述
现有如下R语言DataFrame:
df <- data.frame(id = c(1,2,3), date1 = c("2014-Dec 2018","2009-2010","Jan 2009-Aug 2010"), date2 = c("Feb 2016-Dec 2018","2014-Dec 2018","Oct 2013-Dec 2018"))
需要生成新的DataFrame,为原数据的date1、date2列分别创建统计字符数的新列,同时将缺失值替换为0。期望输出如下:
data.frame(id = c(1,2,3), date1_count_character = c("13","9","17"), date2_count_character = c("17","13","17"))
解决方案
方法1:基础R实现
直接通过列操作生成统计列,处理缺失值并转换格式:
# 为date1生成字符统计列,缺失值替换为0并转为字符型 df$date1_count_character <- as.character(ifelse(is.na(df$date1), 0, nchar(df$date1))) # 为date2生成字符统计列 df$date2_count_character <- as.character(ifelse(is.na(df$date2), 0, nchar(df$date2))) # 提取需要的列组成新DataFrame new_df <- df[, c("id", "date1_count_character", "date2_count_character")] # 输出结果 print(new_df)
方法2:tidyverse(dplyr)批量处理
如果使用tidyverse工具集,可以更简洁地批量处理多列:
library(dplyr) new_df <- df %>% # 批量处理date1和date2列,生成统计列 mutate( across( .cols = c(date1, date2), .fns = ~ as.character(ifelse(is.na(.), 0, nchar(.))), .names = "{.col}_count_character" # 自动生成新列名 ) ) %>% # 保留需要的列 select(id, date1_count_character, date2_count_character) # 输出结果 print(new_df)
关键说明
nchar():用于统计字符串的总字符数,包含空格、连字符等所有可见字符ifelse(is.na(x), 0, nchar(x)):判断并将缺失值替换为0as.character():将数值型计数结果转为字符型,匹配期望输出的格式- tidyverse的
across():批量处理指定列,通过{.col}自动复用原列名生成新列,减少重复代码
内容的提问来源于stack exchange,提问作者Erik Brole
相关产品推荐
相关产品推荐

