修改 R 中的数据框
Modifying the data frame in R
我有一个这样的数据框,由 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
.....
我该怎么做?
您可以这样做,使用库 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
列,然后我们 "factorize" 数据框,然后我将字符中的日期更改为数字,并按 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
您可以使用 reshape2 包中的 melt() 函数。它将数据框从宽格式转换为长格式。
D <- data.frame(
c("pr1","pr2","pr3","pr4"),
c(0.1,0.0,0.3,0.2),
c(0.2,0.1,0.3,0.4),
c(0.2,0.1,0.3,0.4)
)
colnames(D) <- c("id", 1:(ncol(D)-1))
library(reshape2) # for melt function
D2 <- melt(D, value.name="id")
结果:
> 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
方式略有不同:
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
以下版本使用 tidyr,它本质上是 reshape2 2.0,旨在与包括 dplyr、ggplot2 等在内的 tidyverse 软件包套件一起使用。
该代码将数据收集为整洁的形式,将变量 headers 转换为新列但不包括列 "id"。
然后数据按 id 顺序排列,但代表前一个 headers 的列被删除。
library(tidyr);library(dplyr)
data %>% gather(., key="var", value="value", -id) %>%
arrange(id) %>%
select(-var)
保留 "var" 列可能是明智的,因为它会为以后的处理或可视化提供更大的灵活性(例如,按该列着色)
我有一个这样的数据框,由 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
.....
我该怎么做?
您可以这样做,使用库 dplyr
和 reshape2
。我还需要根据假定的 row.names:
重新创建您的数据:
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
列,然后我们 "factorize" 数据框,然后我将字符中的日期更改为数字,并按 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
您可以使用 reshape2 包中的 melt() 函数。它将数据框从宽格式转换为长格式。
D <- data.frame(
c("pr1","pr2","pr3","pr4"),
c(0.1,0.0,0.3,0.2),
c(0.2,0.1,0.3,0.4),
c(0.2,0.1,0.3,0.4)
)
colnames(D) <- c("id", 1:(ncol(D)-1))
library(reshape2) # for melt function
D2 <- melt(D, value.name="id")
结果:
> 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
方式略有不同:
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
以下版本使用 tidyr,它本质上是 reshape2 2.0,旨在与包括 dplyr、ggplot2 等在内的 tidyverse 软件包套件一起使用。 该代码将数据收集为整洁的形式,将变量 headers 转换为新列但不包括列 "id"。 然后数据按 id 顺序排列,但代表前一个 headers 的列被删除。
library(tidyr);library(dplyr)
data %>% gather(., key="var", value="value", -id) %>%
arrange(id) %>%
select(-var)
保留 "var" 列可能是明智的,因为它会为以后的处理或可视化提供更大的灵活性(例如,按该列着色)