Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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将列拆分为向量-与列顺序无关_R_List_Vector - Fatal编程技术网

按组R将列拆分为向量-与列顺序无关

按组R将列拆分为向量-与列顺序无关,r,list,vector,R,List,Vector,编辑 这个问题似乎是问题的重复,建议回答split(df$b,df$id)。首先,我对解决方案感到满意,我意识到给出的答案并不能完全解决我的问题。在下面的问题中,我想获得一个列表,其中向量元素被分配给第三列的值(在我的示例中df$a)。这一点很重要,否则,df$b的顺序会起作用。我的意思是,显然我可以通过df$a进行安排,然后调用split() 我的示例df: df <- data_frame(id = paste0('id',rep(1:2, each = 5)), a = rep(le

编辑 这个问题似乎是问题的重复,建议回答
split(df$b,df$id)
。首先,我对解决方案感到满意,我意识到给出的答案并不能完全解决我的问题。在下面的问题中,我想获得一个列表,其中向量元素被分配给第三列的值(在我的示例中
df$a
)。这一点很重要,否则,
df$b
的顺序会起作用。我的意思是,显然我可以通过
df$a
进行安排,然后调用
split()

我的示例df:

df <- data_frame(id = paste0('id',rep(1:2, each = 5)), a = rep(letters[1:5],2),b=c(1:5,5:1))
这导致:

list_group_elements
[[1]]
 a   b   c   d   e 
"a" "b" "c" "d" "e" 

[[2]]
a b c d e 
1 2 3 4 5 

[[3]]
a b c d e 
5 4 3 2 1 
我不需要列表中的第一个元素,但其余的基本上就是我需要的。我有一种特殊的印象,我的方法有点不理想,如果有人有改进的想法(例如,使用dplyr?),我将不胜感激。为什么要这样做:我制作了一个使用向量作为参数的函数,我想在dataframes中的某些列上运行这个函数,但只使用分组值作为参数,而不是整个列

一种方法是

lapply(levels(df$id), function(L) df$b[df$id == L])
[[1]]
[1] 1 2 3 4 5

[[2]]
[1] 5 4 3 2 1

考虑一下
by
,它是
tapply
的面向对象包装器,设计用于按因子拆分数据帧:


您可以使用
setNames
df$b
作为命名向量,然后
将其拆分为一个列表:

split(setNames(df$b, df$a), df$id)
# $id1
# a b c d e 
# 1 2 3 4 5 
# 
# $id2
# a b c d e 
# 5 4 3 2 1

我想到了lapply,但没有想到创建这个漂亮的函数。谢谢这回答了我的问题。好极了(我只能在几分钟内接受你的答案…)虽然我承认-我真的不理解这个函数。。。哈哈,我得弄清楚这件事。为什么要偷懒
split(df$b,df$id)
Yes,@Henrik提出了这个建议,这是迄今为止最优雅的解决方案。@G5W抱歉,我没有接受你的答案,因为在Henrik发表评论后,我意识到给出的答案并没有完全解决我的问题-这不是你的错,但我的问题没有被准确地问到。我现在已经编辑了我的问题,我希望它能让这一点更加清晰。
split(df$b,df$id)
@Henrik,感谢您指出这一点,特别是帮助我理解您所指的繁琐问题和答案。事实上,我已经看到了这个问题,因为它是以一种不明确的方式问我的,我认为它不是我要找的。但是你当然是绝对正确的,谢谢你挖掘出隐藏在评论中的问题的答案。@Henrik此外,我想如果你能提供你的解决方案作为答案,我可以接受,其他没有经验的用户也可以像我一样更容易地找到这个奇妙的答案,因为它不会在评论中被扯掉。@Henrik,再一次,经过一些考虑-我相信所有给出的答案都不完全是我想要的。我已经编辑了我的问题,希望它能更清楚地说明我需要什么。您可以在拆分之前将
df$b
命名为向量:
split(setNames(df$b,df$a,df$id)
。有趣!!谢谢不幸的是,@G5W的回答速度更快,但我真的很喜欢简短的代码。
by(df, df$id, FUN=function(i) i$b)
split(setNames(df$b, df$a), df$id)
# $id1
# a b c d e 
# 1 2 3 4 5 
# 
# $id2
# a b c d e 
# 5 4 3 2 1