如何将多行合并成一列?

3

我对R和编程还很陌生,现在我遇到了一个问题,我的data.frame无法让我继续工作。

我有一组如下的数据

表1

    Individual             Score
    Tim                      45
    Tim                      77
    Tim                      32
    Clare                    92
    Clare                    70
    Clare                    88

让我解释一下上面的表格1,我有几个人(例如上面的TIm和Clare),并且我知道他们在3个不同场合(2009年、2010年、2011年)参加考试时的得分。我正在尝试将上述内容转换为以下形式:

表格2

    Individual             Score09             Score10             Score11
    Tim                      45                   77                  32
    Clare                    92                   70                  88

我使用ddply获得了表格1,因为我最初拥有测试子集信息(变量分数只是所有子集的总和)。
请告诉我是否有一种方法可以最终获得表2而不是表1,因为我有超过10000个观测值,表1设置不允许我按照预期进行操作。
编辑:
生成表格1的原始df如下所示:
数据框如下:
    Base          Individual     score_math    score_bio     score_chem
    SB1120091       Tim              12            23             10
    SB1120092       Tim              30            25             22
    SB1120101       Tim              17             5             10
    SB1120091       Clare            50            20             22
    SB1120092       Clare            40            10             20
    SB1120101       Clare            47            20             21

代码如下:

>Table1 <-ddply(x, .(个人), summarise, 分数=(数学分数*生物分数*化学分数))

EDIT2:

原始数据集中没有年份变量,但有一个基础变量提供了关于测试时间的信息。

另外,分数变量是由所有子集分数的乘积计算得出的。


1
你获取表格1的代码是什么? - Aaron left Stack Overflow
请查看我对下面答案的评论。 - joran
与其修改表1,就像目前的答案所做的那样,直接获取表2似乎是更好的选择。我认为您从表1中提供的代码足以看出如何操作,但仍不够清晰。您的“x”数据框长什么样? - Aaron left Stack Overflow
@Aaron 我已经用原始数据框编辑了问题。 - MJAS
@Aaron 这个数据集是一个虚拟数据集,我试图让它对我来说尽可能简单,因为我在这个领域缺乏专业知识,但是它没有起作用... 我没有像“year”那样的年变量,我有一个包含字母和数字的代码,它指代了特定学期考试时所采用的年份(SB1120111 指的是2011年第一学期采用SB11考试)... 此外,总分是通过一个可变的Cobb-Douglas函数计算得出的。 - MJAS
显示剩余7条评论
4个回答

4
数据:
df <- structure(list(Individual = structure(c(2L, 2L, 2L, 1L, 1L, 1L), 
                     .Label = c("Clare", "Tim"), class = "factor"), 
                     Score = c(45, 77, 32, 92, 70, 88), 
                     count = c(1L, 2L, 3L, 1L, 2L, 3L)), 
                     .Names = c("Individual", "Score", "count"), 
                     row.names = c(NA, -6L), class = "data.frame")
df$count <- rep(c("09", "10", "11"), 2)
  • Using reshape from base stat:

    > reshape(df, idvar="Individual", timevar="count", direction="wide", sep="")
    
    #   Individual Score09 Score10 Score11
    # 1        Tim      45      77      32
    # 4      Clare      92      70      88
    

1
为什么不用“+1”代替“count”,而是创建一个年份变量呢?这是一个简单的“transform”语句,应用于原始数据:df<-transform(df, timevar=ave(Score, Individual, FUN=function(x) 8 + seq(x))) - Matthew Plourde

2
您可以使用reshape2包进行操作:
# presuming your data frame is 'xx'
library(reshape2)

# Create a 'Case' Column
xx$Case <- rep(paste0("Score", c("09", "10", "11")), 2)

dcast(xx, Individual ~ Case, value.var="Score")
 Individual Score09 Score10 Score11
      Clare      92      70      88
        Tim      45      77      32

2

现在您已经提供了原始表格,使用xtabs()在原始数据集上。假设您的数据集命名为“x”:

xtabs(score_math + score_bio + score_chem ~ Individual + Year, x)
#           Year
# Individual 2009 2010 2011
#      Clare   92   70   88
#      Tim     45   77   32

太好了 - 我总是忘记xtabs可以求和。 - Aaron left Stack Overflow

1
您的ddply调用是通过“Individual”将函数分割,这会导致每个个体都有一个单独的数据框,并在每个数据框上单独计算总和。数据集中每个个体都有多行,因此此总和对于每一行都有一个总和。然后将数据组合在一起,默认情况下,结果为每个初始行提供一行。但是您希望每个个体都有一行;如果我们只是转置结果,它就变成了一个具有一行的矩阵,从而实现了所需的行为。
使用您提供的数据:
x <- read.table(text="Year Individual score_math score_bio score_chem
2009 Tim 12 23 10
2010 Tim 30 25 22
2011 Tim 17 5 10
2009 Clare 50 20 22
2010 Clare 40 10 20
2011 Clare 47 20 21", header=TRUE)

这是一个修改后的ddply调用示例:
> ddply(x, .(Individual), summarise, Score=t((score_math+score_bio+score_chem)))
  Individual Score.1 Score.2 Score.3
1      Clare      92      70      88
2        Tim      45      77      32

ddply并不是很适合这种情况,因为你只是在每行上做一个非常简单的计算,然后重新整理数据。我的偏好是添加一个总得分列,然后使用reshape2包中的dcast函数。这种方式的优点是你将拥有一个完整的主数据集,里面包含了之后可能需要的所有信息,并且可以用它来进行所有的计算和转换。

library(reshape2)
x$Total <- with(x, score_math + score_bio + score_chem)
dcast(x, Individual ~ Year, value.var="Total")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接