You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:58:18