R-将重复的行值重塑为列

时间:2018-11-07 16:20:59

标签: r reshape data-science tidyverse

我有这样的数据:

Name     Rating
Tom      3
Tom      4
Tom      2
Johnson  5  
Johnson  7

但是我想要这样,所以每个唯一的名称都应该是一列,每一行中的评分都在下面。我该如何处理?

3 个答案:

答案 0 :(得分:0)

嗯,这可以完成工作,但是会引入一些NA。 编辑:将NA替换为其他一些等级。

 mydata<-data.frame(Name=c("Tom","Tom","Tom","Johnson","Johnson"),Rating=c(3,4,2,5,7))
    library(reshape2)
    library(tidyverse)



mydata1<-mydata %>% 
  mutate(Name=as.factor(Name)) %>% 
melt(id.var="Name") %>% 
  dcast(variable+value~Name) %>% 
  select(-value) %>% 
  rename(Name=variable) %>%
 select_if(is.numeric) 
mydata1 %>% 
  mutate(Johnson=as.factor(Johnson),Tom=as.factor(Tom)) %>% 
  mutate(Johnson=fct_explicit_na(Johnson,na_level = "No Rating"),
         Tom=fct_explicit_na(Tom,na_level = "No Rating"))

 Johnson       Tom
1 No Rating         2
2 No Rating         3
3 No Rating         4
4         5 No Rating
5         7 No Rating

答案 1 :(得分:0)

这是一个很好的方法

x <- data.frame(c("Tom", "Tom", "Tom", "Johnson", "Johnson"), c(3,4,2,5,7))
colnames(x) <- c("Name", "Rating")
n <- unique(x[,1])
m <- max(table(x[,1]))
c <- data.frame(matrix(, ncol = length(n), nrow = m))
for (i in 1:length(n)) {
  l <- x[which(x[,1] == n[i]), 2]
  l2 <- rep("", m - length(l))
  c[,i] <- c(l, l2)
}
colnames(c) <- n

结果:

  Tom Johnson
1   3       5
2   4       7
3   2        

答案 2 :(得分:0)

这是使用CRAN软件包reshape的一种方法。

library(reshape2)

d <- dcast(mydata, Rating ~ Name, value.var = "Rating")[-1]
d
#  Johnson Tom
#1      NA   2
#2      NA   3
#3      NA   4
#4       5  NA
#5       7  NA

如您所见,此结果中的NA值太多。摆脱它们的一种方法可能是:

d <- lapply(d, function(x) x[!is.na(x)])
n <- max(sapply(d, length))
d <- do.call(cbind.data.frame, lapply(d, function(x) c(x, rep(NA, n - length(x)))))

d
#  Johnson Tom
#1       5   2
#2       7   3
#3      NA   4