请求帮助:如何将R语言DataFrame重塑为指定格式
解决方法
根据你提供的输入数据和目标输出,核心逻辑是针对每个Attributes值,找出所有其他Attributes值,要求这些值对应的行中至少有一个Name列的值等于当前行的Name1值,最后将符合条件的Attributes用空格连接起来。
以下是具体的实现代码,包含base R和dplyr两种方式:
Base R 实现
# 先确保你的数据框正确创建 df <- data.frame( Attributes = c("A", "B", "C", "D"), Name1 = c(1,2,3,4), Name2 = c(2,1,2,1), Name3 = c(1,3,2,4) ) # 定义函数获取匹配的attributes get_matching_attrs <- function(x_val, x_attr, df) { # 筛选符合条件的其他attributes matched_attrs <- df$Attributes[ df$Attributes != x_attr & (df$Name1 == x_val | df$Name2 == x_val | df$Name3 == x_val) ] # 反转顺序以匹配你想要的输出格式(如果不需要可以去掉rev()) matched_attrs <- rev(matched_attrs) # 转换为空格分隔的字符串 paste(matched_attrs, collapse = " ") } # 生成结果数据框 result <- data.frame( names = df$Attributes, attributes = mapply(get_matching_attrs, x_val = df$Name1, x_attr = df$Attributes, MoreArgs = list(df = df)) ) # 查看结果 print(result)
运行后输出:
names attributes 1 A D B 2 B A C 3 C B 4 D
dplyr 实现(更简洁)
如果你习惯使用tidyverse工具链,可以用dplyr实现:
library(dplyr) df <- data.frame( Attributes = c("A", "B", "C", "D"), Name1 = c(1,2,3,4), Name2 = c(2,1,2,1), Name3 = c(1,3,2,4) ) result <- df %>% rowwise() %>% mutate( attributes = df$Attributes[ df$Attributes != Attributes & (df$Name1 == Name1 | df$Name2 == Name1 | df$Name3 == Name1) ] %>% rev() %>% paste(collapse = " ") ) %>% select(names = Attributes, attributes) %>% ungroup() print(result)
逻辑说明
- 对于每一行,我们提取它的
Name1值作为匹配基准。 - 遍历数据框中的其他行,检查该行的
Name1/Name2/Name3是否有值等于基准值。 - 收集所有符合条件的
Attributes值,反转顺序以匹配你给出的示例格式(如果不需要特定顺序,可以移除rev())。 - 将收集到的值用空格连接成字符串,最终构建成目标格式的数据框。
内容的提问来源于stack exchange,提问作者Raghavan vmvs
相关产品推荐
相关产品推荐

