R语言:如何为DataFrame添加同名出现次数列及车辆列表列?
问题解决:为df1添加出现次数和车辆列表列
你的代码问题在于:df2$Name==df1$Name会触发R的向量循环回收机制,最终length(which(...))计算的是df2中与df1所有姓名匹配的总次数,不是每行姓名单独的出现次数,所以整列会被赋值为同一个数,不符合需求。下面是两种场景的正确实现:
需求1:新增列记录姓名在df2中的出现次数
方法1:基础R实现
df1 <- data.frame(Name=c('Nick', 'Mary', 'Linus', 'Eva', 'Michael','John')) df2 <- data.frame(Name=c('Nick', 'John', 'Mary', 'John', 'Paul', 'John'), Car=c('VW', 'Volvo', 'Toyota', 'Opel', 'Opel', 'VW')) # 统计df2中各姓名的出现频次 name_counts <- table(df2$Name) # 匹配df1的姓名,转换为整数类型 df1$Occurrences_in_df2 <- as.integer(name_counts[df1$Name]) # 把在df2中不存在的姓名的次数设为0 df1$Occurrences_in_df2[is.na(df1$Occurrences_in_df2)] <- 0
方法2:dplyr(tidyverse)实现
如果习惯使用tidyverse工具链,代码更简洁直观:
library(dplyr) df1 <- df1 %>% # 先统计df2的姓名频次,再左连接到df1 left_join(count(df2, Name, name = "Occurrences_in_df2"), by = "Name") %>% # 把缺失值替换为0 mutate(Occurrences_in_df2 = replace_na(Occurrences_in_df2, 0))
需求2:新增列列出每个人员的所有车辆
方法1:基础R实现
# 按姓名分组,把车辆用逗号拼接成字符串 car_list <- aggregate(Car ~ Name, data = df2, FUN = function(x) paste(x, collapse = ", ")) # 左连接到df1,保留所有df1的姓名 df1 <- merge(df1, car_list, by = "Name", all.x = TRUE) # 把无车辆的记录替换为提示文本 df1$Car[is.na(df1$Car)] <- "无车辆"
方法2:dplyr+tidyr实现
library(dplyr) library(tidyr) df1 <- df1 %>% left_join( df2 %>% group_by(Name) %>% summarise(Car = str_c(Car, collapse = ", ")), by = "Name" ) %>% mutate(Car = replace_na(Car, "无车辆"))
内容的提问来源于stack exchange,提问作者John Fistikis
相关产品推荐
相关产品推荐

