我遇到了以下问题。我有一个data.frame,x和y列代表空间中的某些点:
X<-c(18.25743,18.25783,18.25823,18.25850,18.25863,18.25878,
18.25885,18.25912,18.25943,18.25962,18.25978,18.26000,
18.26022,18.26051,18.26070,18.26095,18.26118,18.26140,
18.26189,18.26250,18.26310,18.26390)
Y<-c(44.69561,44.69564,44.69567,44.69567,44.69586,
44.69600,44.69637,44.69671,44.69691,44.69701,44.69720,
44.69740,44.69763,44.69774,44.69787,44.69790,44.69791,
44.69795,44.69812,44.69802,44.69812,44.69834)
eDF<-data.frame(X,Y)
现在我的问题是它们对于绘图是“排序”错误的。所以我需要的是一个函数来将两个点的行一起写在一起(在列表列表中):
1和12是ID1
2和13是ID2
3和14是ID3
...
11和22是ID11
列表列表中每个创建的列表都应该有唯一的ID(只是从1到最后编号)。好吧,因为我的所有数据都有不同长度的问题。
如果第二个连续行选择的起始点(12)是灵活的,总是在数据的一半之后取第一行,那将是很好的。((rownumber / 2)+1)在这个例子中 12。 好吧,我已经尝试了一些东西,我认为我是正确的方式,但我不能自己找出解决方案。
这个功能非常接近,但我无法让它从不同的行(1和12)开始:
lapply(2:nrow(eDF), function(x) eDF[(x-1):x,])
我也尝试用seq来解决它,如果我可以通过连接两个代码示例来创建列表列表,它会做我需要的。我还需要将具体的开始和结束编号更改为动态解决方案。
eDF[(seq(1,to=11,by=1)),] # selecting rows 1 to 11
eDF[(seq(12,to=nrow(eDF),by=1)),] #selecting rows 12 to end
任何想法?
答案 0 :(得分:1)
我们可以修改OP的lapply
代码
lapply(1:11, function(i) eDF[c(i, i+11),])
答案 1 :(得分:1)
我不知道您是否需要新列表中的ID列,但另一种方式是:
#create the IDs
eDF$ID <- rep(1:11,2)
#split the data.frame according to those
mylist <- split(eDF, eDF$ID)
输出:
mylist
$`1`
X Y ID
1 18.25743 44.69561 1
12 18.26000 44.69740 1
$`2`
X Y ID
2 18.25783 44.69564 2
13 18.26022 44.69763 2
$`3`
X Y ID
3 18.25823 44.69567 3
14 18.26051 44.69774 3
$`4`
X Y ID
4 18.2585 44.69567 4
15 18.2607 44.69787 4
#and so on...
如果您不需要ID列,则只能split(eDF, rep(1:11,2)
。