根据列中的值拆分数据框 - 循环列出id

时间:2018-01-12 21:56:26

标签: r

我尝试根据id列中的值拆分数据框。

我有什么:

ids<-as.data.frame(c("a","a","a","b","b","b","c","c","c"))
unique_id<-unique(ids)
values<-as.data.frame(rep(1:3,3))
df<-as.data.frame(cbind(ids,values))
colnames(df)<-c("id","values")

看起来像:

> df
  id values
  a      1
  a      2
  a      3
  b      1
  b      2
  b      3
  c      1
  c      2
  c      3

我得到的代码和错误是:

> for(id in unique_id){
+     paste0("value_for_",id)<-split(df, id = df$id)
+ }
Error in deparse(...) : 
  unused argument (id = c(1, 1, 1, 2, 2, 2, 3, 3, 3))

我想要的是什么:

 value_for_a
  id value
  a     1
  a     2
  a     3

 value_for_b
  id value
  b     1
  b     2
  b     3

 value_for_c
  id value
  c     1
  c     2
  c     3

我觉得这应该是相当直截了当的,但我的想法很新鲜。我并不反对使用比for loop更复杂的方法。

2 个答案:

答案 0 :(得分:1)

您可以使用nest()

library(tidyr)
df%>%
group_by(id)%>%
nest()

# A tibble: 3 x 2
  id     data            
  <fctr> <list>          
1 a      <tibble [3 x 1]>
2 b      <tibble [3 x 1]>
3 c      <tibble [3 x 1]>

每个tibble都包含您感兴趣的值。

df%>%
group_by(id)%>%
nest()%>%
.$data


[[1]]
# A tibble: 3 x 1
  values
   <int>
1      1
2      2
3      3

[[2]]
# A tibble: 3 x 1
  values
   <int>
1      1
2      2
3      3

[[3]]
# A tibble: 3 x 1
  values
   <int>
1      1
2      2
3      3

答案 1 :(得分:0)

我建议使用display:contents函数拆分数据框(R中的函数可以完全按照您的意愿执行)。

例如:

split()

在此您要求按# Using OPs data split(df, df$id) 列分割df。此函数的输出是df的列表。

id

您可以使用以下命令获取所需名称:

$a
  id values
1  a      1
2  a      2
3  a      3

$b
  id values
4  b      1
5  b      2
6  b      3

$c
  id values
7  c      1
8  c      2
9  c      3