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

如何在R语言中根据行名向DataFrame新增列并填充对应数据

基于行名匹配为mtcars新增Cluster列

可复现数据集

首先加载内置数据集mtcars,其行名如下:

row.names(mtcars)
# 输出:
#  [1] "Mazda RX4"           "Mazda RX4 Wag"       "Datsun 710"          "Hornet 4 Drive"     
#  [5] "Hornet Sportabout"   "Valiant"             "Duster 360"          "Merc 240D"          
#  [9] "Merc 230"            "Merc 280"            "Merc 280C"           "Merc 450SE"         
# [13] "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood"  "Lincoln Continental"
# [17] "Chrysler Imperial"   "Fiat 128"            "Honda Civic"         "Toyota Corolla"     
# [21] "Toyota Corona"       "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"         
# [25] "Pontiac Firebird"    "Fiat X1-9"           "Porsche 914-2"       "Lotus Europa"       
# [29] "Ford Pantera L"      "Ferrari Dino"        "Maserati Bora"       "Volvo 142E"

分组数据集df2的定义如下:

df2 <- structure(list(Cluster = c("Group 1", "Group 1", "Group 1", "Group 1", 
"Group 1", "Group 1", "Group 1", "Group 1", "Group 2", "Group 2", 
"Group 2", "Group 2", "Group 2", "Group 2", "Group 2")), row.names = c("Mazda RX4", 
"Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "Hornet Sportabout", 
"Valiant", "Duster 360", "Merc 240D", "Merc 230", "Merc 280", 
"Merc 280C", "Merc 450SE", "Merc 450SL", "Merc 450SLC", "Cadillac Fleetwood"
), class = "data.frame")

需求说明

为mtcars新增Cluster列,填充规则:

  • 仅匹配行名同时存在于mtcars和df2中的记录
  • 匹配成功则将df2$Cluster对应值填入mtcars$Cluster
  • 不匹配的记录保持NA(即跳过填充)

注:实际场景中可能存在df2部分行名不在mtcars中、两者行顺序不一致的情况。

实现方法

方法1:基础R原生操作

利用行名索引匹配,步骤清晰可控:

# 初始化Cluster列为NA
mtcars$Cluster <- NA
# 筛选df2中存在于mtcars的行名
matched_rows <- intersect(row.names(df2), row.names(mtcars))
# 匹配赋值
mtcars[matched_rows, "Cluster"] <- df2[matched_rows, "Cluster"]

方法2:使用match函数快速匹配

一行代码完成,自动处理不匹配的情况:

mtcars$Cluster <- df2$Cluster[match(row.names(mtcars), row.names(df2))]

不匹配的位置会自动设为NA,无需额外初始化,简洁高效。

方法3:dplyr包(tidyverse风格)

适合习惯tidyverse语法的用户,通过行名转列实现匹配:

library(dplyr)

# 将行名转为显式列用于匹配
mtcars_updated <- mtcars %>%
  mutate(car_id = rownames(.)) %>%
  left_join(df2 %>% mutate(car_id = rownames(.)), by = "car_id") %>%
  select(-car_id) %>%
  column_to_rownames(var = "car_id")

验证结果

可通过以下代码查看匹配后的有效记录:

# 查看有Cluster值的记录
mtcars[!is.na(mtcars$Cluster), c("mpg", "Cluster")]

内容的提问来源于stack exchange,提问作者antecessor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:10:16