我有一个类似的数据框,由500行和60列组成。
**%d1 %d2 %d3**
pr1 0.1 0.2 0.2
pr2 0.0 0.1 0.1
pr3 0.3 0.3 0.3
pr4 0.2 0.4 0.4
我想以这种方式为每个数据创建一行
**%
pr1 0.1
pr1 0.2
pr1 0.2
pr2 0.0
pr2 0.1
pr2 0.1
pr3 0.2
pr3 0.4
.....
我该怎么办?
答案 0 :(得分:2)
您可以使用reshape2包中的melt()函数。它将数据帧从宽形式转换为长形式。
> print(D2[order(D2$id),])
id variable id
1 pr1 1 0.1
5 pr1 2 0.2
9 pr1 3 0.2
2 pr2 1 0.0
6 pr2 2 0.1
10 pr2 3 0.1
3 pr3 1 0.3
7 pr3 2 0.3
11 pr3 3 0.3
4 pr4 1 0.2
8 pr4 2 0.4
12 pr4 3 0.4
结果:
ng-model="arform.mainconcern"
答案 1 :(得分:2)
略有不同的方式:
data=data.frame(id=c("pr1","pr2","pr3","pr4"),
d1=c(0.1,0,0.3,0.2),
d2=c(0.2,0.1,.3,0.4),
d3=c(0.2,0.1,0.3,0.4))
library(reshape2)
library(dplyr)
data%>%melt(id.vars="id")%>%group_by(id,value)%>%summarise(count=n())
给出:
id value count
<fctr> <dbl> <int>
1 pr1 0.1 1
2 pr1 0.2 2
3 pr2 0.0 1
4 pr2 0.1 2
5 pr3 0.3 3
6 pr4 0.2 1
7 pr4 0.4 2
答案 2 :(得分:1)
以下版本使用tidyr,它基本上是reshape2 2.0,并且设计用于包括dplyr,ggplot2等的tidyverse包套件。 代码将数据收集到整齐的形式,将变量头转换为新列,但不包括列“id”。 然后,数据以id顺序排列,但代表前一个标题的列将被删除。
library(tidyr);library(dplyr)
data %>% gather(., key="var", value="value", -id) %>%
arrange(id) %>%
select(-var)
保留“var”列可能是明智的,因为它可以为后续处理或可视化提供更大的灵活性(例如,通过该列着色)
答案 3 :(得分:0)
您可以使用库dplyr
和reshape2
执行此操作。我还需要从假定的row.names创建一个Id列:
重新创建数据:
df = data.frame(d1=c(0.1,0,0.3,0.2), d2=c(0.2,0.1,0.3,0.4), d3=c(0.2,0.1,0.3,0.4))
row.names(df) = c("pr1", "pr2", "pr3", "pr4")
计算:首先我们添加id
列,然后我们&#34;分解&#34;数据框,然后我将字符中的日期更改为数字,并按ID排序以获得与您相同的结果。
library(dplyr); library(tibble); library(reshape2)
df %>% rownames_to_column("id") %>% melt %>% mutate(day=as.numeric(variable)) %>%
select(id, day, pc_cum=value) %>% arrange(id)
#### id day pc_cum
#### 1 pr1 1 0.1
#### 2 pr1 2 0.2
#### 3 pr1 3 0.2
#### 4 pr2 1 0.0
#### 5 pr2 2 0.1