修改 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

.....

我该怎么做?

您可以这样做,使用库 dplyrreshape2。我还需要根据假定的 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" 列可能是明智的,因为它会为以后的处理或可视化提供更大的灵活性(例如,按该列着色)