Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于列中的值拆分数据帧-在id和x27的列表上循环;s_R - Fatal编程技术网

R 基于列中的值拆分数据帧-在id和x27的列表上循环;s

R 基于列中的值拆分数据帧-在id和x27的列表上循环;s,r,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") 我得到的代码和错误是: > for(id

我正在尝试根据
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")
我得到的代码和错误是:

> 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))

我觉得这应该是相当简单的,但我还没有想法。我不反对使用比
for循环更复杂的方法,我建议使用
split()
函数拆分数据帧(R中的函数正好可以做您想要的事情)

例如:

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

$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
您可以使用以下命令获取想要的名称:

myList <- split(df, df$id)
names(myList) <- paste0("value_for_", names(myList))
myList您可以使用
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]>
library(tidyr)
df%>%
分组依据(id)%>%
nest()
#一个tibble:3x2
id数据
1A
2 b
3 c
每个tible都包含您感兴趣的值

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
df%>%
分组依据(id)%>%
嵌套()%>%
.$数据
[[1]]
#一个tibble:3x1
价值观
1      1
2      2
3      3
[[2]]
#一个tibble:3x1
价值观
1      1
2      2
3      3
[[3]]
#一个tibble:3x1
价值观
1      1
2      2
3      3

使用
拆分
<代码>拆分(df,df$id)
这与代码中的内容有什么不同吗?使用它时不要尝试分配到
粘贴
,也不要在循环中(它已经矢量化了)
group\u list=split(df,df$id)
是您所需要的全部。列表的名称已经基于
id
列。您不应该将它们作为单独的数据帧,数据帧的
列表
更容易使用。您可以使用for循环或
lappy
进一步并行处理它们,或者一次只处理一个。有关更多讨论和提示,请参阅。如果您确实想这样做,请查看
list2env
。这很漂亮。我以后如何调用这些数据帧?我需要对它们进行其他处理,并将它们与其他数据帧组合。好吧,您可以使用
id
列作为参考,这样您就可以通过使用与您感兴趣的
data
对应的
id
来参考您感兴趣的data.frames。“为什么不使用nest()呢?”因为
split
做同样的事情,并且内置于base R中,所以它不需要任何外部依赖项<代码>拆分(df,df$id)
。啊,那么让我重新措辞一下。我并不是故意要问这个问题。我确实理解你的问题是修辞性的,但我认为这是一个好问题:为什么要使用
library(tidyr);图书馆(dplyr);df%>%group\u by(id)%>%nest()
?,当
拆分(df,df$id)
执行相同的操作时?我认为唯一合理的答案是“如果您已经在使用
dplyr
,可能是
purrr
,并且出于未来工作流的原因,您希望数据帧彼此嵌入,而不仅仅是一个简单的列表,下面介绍如何做到这一点。”
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]>
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