重塑 R 数据框

Reshape R dataframe

我在 R 中创建了以下数据框对象

 df<-data.frame("Attribute"<-c("A", "B", "C", "D"), "Name1"<-c(1,2,3,4), 
 "Name2"<-c(2,1,2,1), "Name3"<-c(1,3,2,4)

 names(df)<-c("Attributes", "Name1", "Name2", "Name3")
 df

我想要以下输出。

        names attributes''
          1     A D B
          2     B A C
          3     C B
          4     D

我无法找到解决方案。在这方面请求您的帮助

试试这个

library(dplyr)
library(data.table)
setDT(df)
df2 <- melt(df, id = 1, measure = patterns("Name"), value.name = "names")
df2 %>%
        select(-2) %>%
        group_by(names) %>%
        distinct() %>%
        summarise(attributes = paste(Attributes, collapse = " "))

# output
# A tibble: 4 x 2
  names attributes
  <dbl>      <chr>
1     1      A B D
2     2      B A C
3     3        C B
4     4          D

这是一个以 R 为基数的解决方案:

df <- data.frame(Attribute=c("A", "B", "C", "D"), Name1=c(1,2,3,4), Name2=c(2,1,2,1), Name3=c(1,3,2,4))
df
A <- df$Attribute
df <- as.matrix(df[-1])
lapply(1:max(df), function(x) A[apply(df==x, 1, any)])
# > lapply(1:max(df), function(x) A[apply(df==x, 1, any)])
# [[1]]
# [1] A B D
# Levels: A B C D
# 
# [[2]]
# [1] A B C
# Levels: A B C D
# 
# [[3]]
# [1] B C
# Levels: A B C D
# 
# [[4]]
# [1] D
# Levels: A B C D

这里是 data.table 的解决方案:

library("data.table")
df <- data.frame(Attribute=c("A", "B", "C", "D"), Name1=c(1,2,3,4), Name2=c(2,1,2,1), Name3=c(1,3,2,4))
df
A <- df$Attribute
df <- setDT(df[-1])
lapply(1:max(as.matrix(df)), function(a) unique(unlist(sapply(df, function(x) A[x==a]))))
# > lapply(1:max(as.matrix(df)), function(a) unique(unlist(sapply(df, function(x) A[x==a]))))
# [[1]]
# [1] A B D
# Levels: A B C D
# 
# [[2]]
# [1] B A C
# Levels: A B C D
# 
# [[3]]
# [1] C B
# Levels: A B C D
# 
# [[4]]
# [1] D
# Levels: A B C D

这是使用 stackby 的基础 R 解决方案:

# Sample data
df <- data.frame(
    Attribute = c("A", "B", "C", "D"),
    Name1 = c(1,2,3,4),
    Name2 = c(2,1,2,1),
    Name3 = c(1,3,2,4))

df.stacked <- data.frame(stack(df[, -1]), Attribute = df$Attribute);
by(df.stacked, df.stacked$values, function(x) list(unique(x$Attribute)))
#[1] A B D
#Levels: A B C D
#------------------------------------------------------------
#[1] B A C
#Levels: A B C D
#------------------------------------------------------------
#[1] C B
#Levels: A B C D
#------------------------------------------------------------
#[1] D
#Levels: A B C D