我正在尝试采用长格式的列并将它们扩展为宽格式,如下所示。我想使用tidyr来解决这个问题,我正在投资的数据操作工具,但是为了使这个答案更通用,请提供其他解决方案。
以下是我所拥有的:
library(dplyr); library(tidyr)
set.seed(10)
dat <- data_frame(
Person = rep(c("greg", "sally", "sue"), each=2),
Time = rep(c("Pre", "Post"), 3),
Score1 = round(rnorm(6, mean = 80, sd=4), 0),
Score2 = round(jitter(Score1, 15), 0),
Score3 = 5 + (Score1 + Score2)/2
)
## Person Time Score1 Score2 Score3
## 1 greg Pre 80 78 84.0
## 2 greg Post 79 80 84.5
## 3 sally Pre 75 74 79.5
## 4 sally Post 78 78 83.0
## 5 sue Pre 81 78 84.5
## 6 sue Post 82 81 86.5
所需的宽格式:
Person Pre.Score1 Pre.Score2 Pre.Score3 Post.Score1 Post.Score2 Post.Score3
1 greg 80 78 84.0 79 80 84.5
2 sally 75 74 79.5 78 78 83.0
3 sue 81 78 84.5 82 81 86.5
我可以为每个分数做这样的事情:
spread(dat %>% select(Person, Time, Score1), Time, Score1) %>%
rename(Score1_Pre = Pre, Score1_Post = Post)
然后使用join,但这看起来很冗长,好像有更好的方法。
相关问题:
tidyr宽到长,有两个重复的度量
是否可以在tidyr中类似于dcast的多个列上使用扩展?
使用数据中的dcast。表包。
library(data.table)#v1.9.5+
dcast(setDT(dat), Person~Time, value.var=paste0("Score", 1:3))
# Person Score1_Post Score1_Pre Score2_Post Score2_Pre Score3_Post Score3_Pre
#1: greg 79 80 80 78 84.5 84.0
#2: sally 78 75 78 74 83.0 79.5
#3: sue 82 81 81 78 86.5 84.5
或者从
baseR
重塑
reshape(as.data.frame(dat), idvar='Person', timevar='Time',direction='wide')
从开发版本tidyr\u 0.8.3.9000或CRAN版本tidyr\u 1.0.0,我们可以对多个值列使用更广泛的透视
library(tidyr)
library(stringr)
dat %>%
pivot_wider(names_from = Time, values_from = str_c("Score", 1:3))
# A tibble: 3 x 7
# Person Score1_Pre Score1_Post Score2_Pre Score2_Post Score3_Pre Score3_Post
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 greg 80 79 78 80 84 84.5
#2 sally 75 78 74 78 79.5 83
#3 sue 81 82 78 81 84.5 86.5
使用整形2:
library(reshape2)
dcast(melt(dat), Person ~ Time + variable)
生产:
Using Person, Time as id variables
Person Post_Score1 Post_Score2 Post_Score3 Pre_Score1 Pre_Score2 Pre_Score3
1 greg 79 78 83.5 83 81 87.0
2 sally 82 81 86.5 75 74 79.5
3 sue 78 78 83.0 82 79 85.5
编辑:我正在更新这个答案,因为pivot_wider已经存在一段时间了,它解决了这个问题和评论中的问题。你现在可以做了
pivot_wider(
dat,
id_cols = 'Person',
names_from = 'Time',
values_from = c('Score1', 'Score2', 'Score3'),
names_glue = '{Time}.{.value}'
)
以获得预期结果。
最初的答案是
dat %>%
gather(temp, score, starts_with("Score")) %>%
unite(temp1, Time, temp, sep = ".") %>%
spread(temp1, score)
问题内容: 首先,我认为必须将JavaScript转换为PHP,但是后来发现,由于服务器和客户端的执行,我无法这样做。所以现在我只想发送一个变量 到一个PHP变量 假设我单击一个按钮,就会执行JavaScript中的该函数。 现在,我不知道如何将phpvariable分配给JavaScript,以便使用phpvariable在数据库中查找内容。我知道我可以将其添加到URL或某些内容中并刷新页面,但
我只看到系统变量。有人能澄清这一点吗? 干杯A。
我调用test.sh从PHP使用shell_exec方法。 然而,命令行脚本说它只收到一个参数: /tmp/my_script.php 当我将呼叫更改为: 代码: 它说它收到了3个参数,但是argv[1]和argv[2]是空的。 当我将呼叫更改为: 代码: 脚本最终按预期接收所有3个参数。 您是否总是必须随脚本发送仅引用的文本,并且不允许发送$var之类的变量?或者你有没有什么特殊的方式发送$va
我想实现一个简单的排序函数,排序列表并返回排序列表(非常容易!)。所以我写了这个 问题是,当我试图对一个简单的列表排序时,它会给我带来这样的错误 那有什么问题?! 提前感谢:)))
可能重复: Java中的动态变量名: 假设我有一个字符串,如下所示。 现在,我想创建一个字符串,但是字符串的变量将被称为“Hello”。为了使字符串名为“Hello”,我必须访问string以获取名称“Hello”,这样我就可以将其用作变量名。下面是我想看的。 感谢您的努力,请尝试向我解释,因为我是Java初学者D
我不熟悉泛型,并且深入研究了一些基本上超出我知识范围的东西,所以请耐心听我说。也许我问的问题很傻,但我似乎无法找到一个明确的答案来说明我希望做的事情是否可行,也许是因为我不知道要寻找的正确术语。 我有两个Java类,它们由一个T类型的实体参数化——一个存储库和一个服务。由于我的所有存储库和所有服务都将执行一些相同的基本任务,因此我的通用repo和服务已经实现了上述任务,并通过受保护的功能将它们提供