在 R 中重塑和求和数据帧值
Reshaping and summing dataframe values in R
我有一个这样的数据框 (full
):
通过合并数字 ID 代码列表和数据框(可重现示例)获得:
library(plyr)
library(dplyr)
#Create example list: ID codes
l1 <- c(10, 100, 1500)
l2 <- c(45, 100)
l3 <- c(100, 1500, 3000, 4000)
l <- list(l1, l2, l3)
#Convert list into dataframe
ldf <- ldply(l, rbind)
#Create example dataframe
i <- data.frame(index = c(1, 3, 5))
#Merge the two dataframes
full <- merge(i, ldf, by = 'row.names', all = TRUE) %>% select(-Row.names)
我想按如下方式重塑数据框:
为了得到每个ID码的索引值之和。
有什么想法吗??
在 Base R 中,我们可以 aggregate
堆叠它们后的值:
aggregate(index~values, cbind(full['index'],stack(full,-1)), sum)
values index
1 10 1
2 45 3
3 100 9
4 1500 6
5 3000 5
6 4000 5
使用 tidyverse:
library(tidyverse)
full %>%
pivot_longer(-index, values_drop_na = TRUE) %>%
group_by(value) %>%
summarise(sum_index = sum(index))
# A tibble: 6 x 2
value sum_index
<dbl> <dbl>
1 10 1
2 45 3
3 100 9
4 1500 6
5 3000 5
6 4000 5
这是一个data.table方法:
library(data.table)
melt(setDT(full),id="index",na.rm=T)[, .(Sum.index = sum(index)), by=.(Cell.ID=value)]
输出:
Cell.ID Sum.index
1: 10 1
2: 45 3
3: 100 9
4: 1500 6
5: 3000 5
6: 4000 5
我有一个这样的数据框 (full
):
通过合并数字 ID 代码列表和数据框(可重现示例)获得:
library(plyr)
library(dplyr)
#Create example list: ID codes
l1 <- c(10, 100, 1500)
l2 <- c(45, 100)
l3 <- c(100, 1500, 3000, 4000)
l <- list(l1, l2, l3)
#Convert list into dataframe
ldf <- ldply(l, rbind)
#Create example dataframe
i <- data.frame(index = c(1, 3, 5))
#Merge the two dataframes
full <- merge(i, ldf, by = 'row.names', all = TRUE) %>% select(-Row.names)
我想按如下方式重塑数据框:
为了得到每个ID码的索引值之和。
有什么想法吗??
在 Base R 中,我们可以 aggregate
堆叠它们后的值:
aggregate(index~values, cbind(full['index'],stack(full,-1)), sum)
values index
1 10 1
2 45 3
3 100 9
4 1500 6
5 3000 5
6 4000 5
使用 tidyverse:
library(tidyverse)
full %>%
pivot_longer(-index, values_drop_na = TRUE) %>%
group_by(value) %>%
summarise(sum_index = sum(index))
# A tibble: 6 x 2
value sum_index
<dbl> <dbl>
1 10 1
2 45 3
3 100 9
4 1500 6
5 3000 5
6 4000 5
这是一个data.table方法:
library(data.table)
melt(setDT(full),id="index",na.rm=T)[, .(Sum.index = sum(index)), by=.(Cell.ID=value)]
输出:
Cell.ID Sum.index
1: 10 1
2: 45 3
3: 100 9
4: 1500 6
5: 3000 5
6: 4000 5