R语言从RealAttribute列提取属性值生成新列的问题求助
解决R中DataFrame属性列映射生成新列的问题
问题分析
- 核心需求是将
RealAttribute_1到RealAttribute_10这10列,分别映射到对应的属性列(如intelligence、attractiveness等),生成新列存储对应值。 apply返回全NA通常是因为未正确匹配列与属性的对应关系,或是apply的MARGIN参数设置错误(默认按列处理,若误按行处理会导致匹配失败)。c_across报错是因为它必须在rowwise()上下文的mutate()等数据掩码动词内使用,且引用列时需确保列名正确,或使用all_of()等工具处理动态列名。
1. 构造示例数据(可复现测试)
先模拟你的realData结构,确保代码能直接运行:
set.seed(123) # 固定随机种子,结果可复现 # 定义10个属性名称 attributes <- c("intelligence", "attractiveness", "humor", "kindness", "creativity", "confidence", "empathy", "ambition", "honesty", "sociability") # 生成5行10列的随机数据 realData <- as.data.frame(matrix(sample(1:10, 5*10, replace = TRUE), nrow = 5)) # 设置列名为RealAttribute_1到RealAttribute_10 colnames(realData) <- paste0("RealAttribute_", 1:10)
2. dplyr + purrr 灵活映射方案(推荐)
无需硬编码每个列,适合批量处理:
library(dplyr) library(purrr) # 建立原列名与目标属性名的映射:键是目标属性名,值是原列名 col_attr_map <- set_names(paste0("RealAttribute_", 1:10), attributes) # 批量生成新列 realData_new <- realData %>% mutate(!!!map2(col_attr_map, names(col_attr_map), function(orig_col, new_col_name) { # 提取原列的值作为新列 across(all_of(orig_col), ~.x) }))
关键解释
set_names创建原列到新属性名的映射关系,确保每个RealAttribute_X对应正确的属性。!!!将map2生成的列表展开为mutate的参数,实现批量生成新列。all_of()安全引用动态列名,避免数据掩码环境下的列名解析错误。
3. base R 简洁方案
无需加载额外包,快速实现需求:
# 建立属性名与原列索引的映射 attr_col_index <- set_names(1:10, attributes) # 批量生成新列并合并到原数据框 realData_new_base <- cbind(realData, lapply(attr_col_index, function(idx) realData[, idx]))
关键解释
lapply遍历每个属性对应的原列索引,提取对应列的值作为新列。cbind将新列列表直接合并到原数据框。
4. 手动硬编码方案(适合少量列场景)
若属性与列的对应关系固定且数量少,可直接手动指定:
realData_new_manual <- realData %>% rowwise() %>% mutate( intelligence = c_across(RealAttribute_1), attractiveness = c_across(RealAttribute_2), humor = c_across(RealAttribute_3), kindness = c_across(RealAttribute_4), creativity = c_across(RealAttribute_5), confidence = c_across(RealAttribute_6), empathy = c_across(RealAttribute_7), ambition = c_across(RealAttribute_8), honesty = c_across(RealAttribute_9), sociability = c_across(RealAttribute_10) ) %>% ungroup()
注意事项
必须在rowwise()之后使用c_across,处理完成后用ungroup()取消行分组,避免后续操作出错。
内容的提问来源于stack exchange,提问作者Yahel
相关产品推荐
相关产品推荐

