如何在R中统计每行唯一登录日期数并添加至数据集
嘿,这个需求我之前也帮人解决过,给你两种在R里轻松实现的方法,你可以根据自己常用的工具选:
首先先把你的示例数据搭好(方便你直接测试):
# 构造示例数据集 df <- data.frame( id = 1:3, name = c("A", "B", "C"), address = c("地址1", "地址2", "地址3"), last_log_june1 = as.Date(c("2020-06-01", "2020-06-01", "2020-06-01")), last_log_june2 = as.Date(c("2020-06-01", "2020-06-01", "2020-06-02")), last_log_june3 = as.Date(c("2020-06-03", "2020-06-01", "2020-06-03")), stringsAsFactors = FALSE )
方法1:用tidyverse(dplyr)实现
如果你平时习惯用tidyverse系列包,这个方法代码更直观:
library(tidyverse) df <- df %>% rowwise() %>% # 按行处理数据 mutate( # 统计所有以last_log_开头的列里的唯一日期数,自动忽略NA unique_login_count = n_distinct(c_across(starts_with("last_log_")), na.rm = TRUE) ) %>% ungroup() # 取消行分组,避免后续操作受影响
方法2:Base R实现(无需额外安装包)
如果不想加载第三方包,用Base R也能搞定:
# 第一步:筛选出所有以last_log_开头的列 log_column_indices <- grep("^last_log_", names(df)) # 第二步:逐行计算这些列里的唯一日期数量(忽略NA) df$unique_login_count <- apply(df[, log_column_indices], 1, function(row) { length(unique(na.omit(row))) })
最终结果
运行完上面任意一种方法后,你的数据集会新增unique_login_count列,结果如下:
id name address last_log_june1 last_log_june2 last_log_june3 unique_login_count 1 1 A 地址1 2020-06-01 2020-06-01 2020-06-03 2 2 2 B 地址2 2020-06-01 2020-06-01 2020-06-01 1 3 3 C 地址3 2020-06-01 2020-06-02 2020-06-03 3
小提示
如果你的日期列目前是字符类型(不是Date格式),记得先转成日期类型,比如:
# 把last_log开头的列转成Date格式 df[, log_column_indices] <- lapply(df[, log_column_indices], as.Date)
内容的提问来源于stack exchange,提问作者Rachita
相关产品推荐
相关产品推荐

