【问题标题】:How to manipulate or transpose a dataset for use in R or SPSS如何操作或转置数据集以在 R 或 SPSS 中使用
【发布时间】:2018-12-19 20:17:15
【问题描述】:

我需要将原始数据 (csv) 处理为宽格式,以便我可以在 R 或 SPSS 中进行分析。

看起来像这样:

1,age,30 
1,race,black 
1,scale_total,35
2,age,20
2,race,white
2,scale_total,99

理想情况下它看起来像:

ID,age,race,scale_total, etc
1, 30, black, 35 
2, 20, white, 99

我在原始数据(ID、问题、响应)的第一行添加了值并尝试了 cast 函数,但我相信这个聚合数据而不是仅仅转换它:

data_mod <- cast(raw.data2, ID~Question, value="Response")
Aggregation requires fun.aggregate: length used as default

【问题讨论】:

标签: r spss


【解决方案1】:

你可以使用tidyr...

library(tidyr)
df<-read.csv(text="1,age,30 
    1,race,black 
    1,scale_total,35
    2,age,20
    2,race,white
    2,scale_total,99", header=FALSE, stringsAsFactors=FALSE)

df %>% spread(key=V2,value=V3)

  V1 age   race scale_total
1  1 30  black           35
2  2  20  white          99

【讨论】:

    【解决方案2】:

    我们需要创建一个序列列来处理默认情况下会聚合到length的重复行

    library(data.table)
    dcast(setDT(df1), ID + rowid(Question) ~ Question, value.var = 'Response')
    

    注意:示例数据在不使用序列列的情况下显然有效(给出预期输出)。

    dcast(setDT(df1), ID ~ Question)
    #   ID age   race scale_total
    #1:  1 30  black           35
    #2:  2  20  white          99
    

    因此,这是应用于具有重复行的完整数据集时的情况

    数据

    df1 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L), Question = c("age", 
    "race", "scale_total", "age", "race", "scale_total"), Response = c("30", 
     "black ", "35", "20", "white", "99")), class = "data.frame", 
     row.names = c(NA, -6L))
    

    【讨论】:

    • 每个 ID 不一定都有与之关联的每个 Question 变量,例如,ID 1 可能没有种族变量,但 ID 2 和 3 有,因为参与者只查看/回答了适用的问题。如果我希望“NA”填写“缺失”数据,您将如何处理?当我运行上面的脚本时,它会为某些 ID 创建多行。 @安德鲁
    • @blacksheep 我认为你的信息是给安德鲁的
    • 抱歉,我是想回复你的。我使用了您提供的代码,但它为每个 ID 创建了多行,我不确定是否可以解决。
    • @blacksheep 是不是基于同一个例子(因为我无法重现)
    【解决方案3】:

    对于 SPSS:

    data list list/ID (f5) Question Response (2a20).
    begin data
    1 "age" "30" 
    1 "race" "black" 
    1 "scale_total" "35"
    2 "age" "20"
    2 "race" "white"
    2 "scale_total" "99"
    end data.
    
    casestovars /id=id /index=question.
    

    请注意,生成的变量 agescale_total 将是字符串变量 - 在进一步转换之前,您必须将它们转换为数字:

    alter type age scale_total (f8).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多