【发布时间】:2019-01-07 21:58:13
【问题描述】:
我正在尝试在我的 R 脚本中整理我的数据,以便我可以对整理后的数据集进行一些统计分析。
其中一列列出了对(其中 6 个),它们对应于三个单独的输出值“块”。最小可重现数据集如下。
dput(head(data, 6))
structure(list(pairs = c("ABC", "ACB", "BAC", "BCA", "CBA", "CAB"), block1vals = c(1, 3, 5, 7, 9, 10), block2vals = c(4, 66, 34, 66, 21, 21), block3vals = c(53, 22, 12, 65, 21, 22)), .Names = c("pairs", "block1vals", "block2vals", "block3vals"), row.names = c(NA, 6L), class = "data.frame")
我得到了我的代码来获取对,并为给定块标记每个参与者的 A/B/C 值,每个块的列;这行得通:
第 1 块:
data$block1types <- sapply(data$pairs, function(x){
if(x == "ABC") { return("Type A")}
if(x == "ACB") { return("Type A")}
if(x == "BAC") { return("Type B")}
if(x == "BCA") { return("Type B")}
if(x == "CBA") { return("Type C")}
if(x == "CAB") { return("Type C")}
})
第 2 块:
data$block2types <- sapply(data$pairs, function(x){
if(x == "ABC") { return("Type B")}
if(x == "ACB") { return("Type C")}
if(x == "BAC") { return("Type A")}
if(x == "BCA") { return("Type C")}
if(x == "CBA") { return("Type B")}
if(x == "CAB") { return("Type A")}
})
第 3 块:
data$block3types <- sapply(data$pairs, function(x){
if(x == "ABC") { return("Type C")}
if(x == "ACB") { return("Type B")}
if(x == "BAC") { return("Type C")}
if(x == "BCA") { return("Type A")}
if(x == "CBA") { return("Type A")}
if(x == "CAB") { return("Type B")}
})
我现在要做的是重新组织数据,以便有一列包含所有“类型 A”参与者值(无论 A 位于哪个块中)以及一个用于“类型 B”和一种用于“C 型”。
所以理想的输出是:
data$TypeA <- c(1, 3, 34, 65, 21, 21)
data$TypeB <- c(4, 22, 5, 7, 21, 22)
data$TypeC <- c(53, 66, 12, 66, 9, 10)
我无法弄清楚如何做到这一点而不产生问题。我这样做的尝试是,在数据集之外创建两列,然后我希望可以传播:
BlockTypes<- combine(data$block1types, data$block2types, data$block3types, .id = NULL)
BlockTotals<- combine(data$block1vals, data$block2vals, data$block3vals, .id = NULL)
然后我尝试这样做:
spread(data, key= BlockTypes, value=BlockTotals, fill = 0)
这失败了:var 必须计算为单个数字或列名,而不是字符向量。不过,我确实认为,更大的问题是将列放在数据集之外。我不能对它们使用扩展函数,因为它们在数据集之外。所以我有点坚持如何做到这一点,如果组合功能不能与 tibble 一起使用。
【问题讨论】:
-
您可以提取第一个(或第二个或第三个)字母并将其粘贴到 type 之后,而不是所有那些
if-statements,以生成所需的列。这样会更有效率。 -
但是关于您的问题,我们需要看到一个最小的可重现数据集和该数据集上的示例所需输出。请提供reproducible example in r。我提供的链接会告诉你如何做。此外,请拨打tour 并访问how to ask。干杯。
标签: r