R 创建频率数据框并从旧数据框传输列
我正在使用map函数从数据帧列表创建频率表。我想从原始数据框导入name列。例如,当我输入R 创建频率数据框并从旧数据框传输列,r,dataframe,dplyr,pipe,purrr,R,Dataframe,Dplyr,Pipe,Purrr,我正在使用map函数从数据帧列表创建频率表。我想从原始数据框导入name列。例如,当我输入df_freq$C时,我希望看到三列,value、n和name。对于name列,我希望所有值都等于“C” #加载包并定义变量 rm(list=ls()) 图书馆(purrr) 图书馆(dplyr) ##加载数据 df_原始%#按名称分割数据 imap(函数(x,x_名称){ data.frame(value=Map(seq.int,x$start,x$end)%>%unlist, name=x_name)}
df_freq$C
时,我希望看到三列,value
、n
和name
。对于name
列,我希望所有值都等于“C”
#加载包并定义变量
rm(list=ls())
图书馆(purrr)
图书馆(dplyr)
##加载数据
df_原始%#按名称分割数据
imap(函数(x,x_名称){
data.frame(value=Map(seq.int,x$start,x$end)%>%unlist,
name=x_name)})
##使用名称列创建频率图
df_频率%
映射(,~count(.x,值))```
可以在tidyverse
中更直接地完成。创建一个rowwise
属性,然后transmute
返回每行从“开始”到“结束”的名称和列表
,unest
列表
列并进行计数
library(dplyr)
library(tidyr)
df_raw %>%
rowwise %>%
transmute(name, value = list(start:end)) %>%
unnest(c(value)) %>%
count(name, value)
-输出
# A tibble: 24 x 3
# name value n
# <chr> <int> <int>
# 1 A 1 1
# 2 A 2 1
# 3 A 3 1
# 4 A 4 2
# 5 A 5 2
# 6 A 6 2
# 7 A 7 1
# 8 A 8 1
# 9 B 3 1
#10 B 4 1
# … with 14 more rows
在OP的代码中,
count
也需要name
列
df %>%
map(., ~count(.x, name, value))
这是一个
数据表
选项
setDT(df)[, .(value = unlist(Map(seq, start, end)), n = 1), .(name)][, .(n = sum(n)), by = .(name, value)]
给
name value n
1: C 2 2
2: C 3 2
3: C 4 2
4: C 5 2
5: C 6 2
6: C 7 2
7: C 8 1
8: C 9 1
9: A 1 1
10: A 2 1
11: A 3 1
12: A 4 2
13: A 5 2
14: A 6 2
15: A 7 1
16: A 8 1
17: B 3 1
18: B 4 1
19: B 5 2
20: B 6 2
21: B 7 2
22: B 8 1
23: B 9 1
24: B 10 1
name value n
setDT(df)[, .(value = unlist(Map(seq, start, end)), n = 1), .(name)][, .(n = sum(n)), by = .(name, value)]
name value n
1: C 2 2
2: C 3 2
3: C 4 2
4: C 5 2
5: C 6 2
6: C 7 2
7: C 8 1
8: C 9 1
9: A 1 1
10: A 2 1
11: A 3 1
12: A 4 2
13: A 5 2
14: A 6 2
15: A 7 1
16: A 8 1
17: B 3 1
18: B 4 1
19: B 5 2
20: B 6 2
21: B 7 2
22: B 8 1
23: B 9 1
24: B 10 1
name value n