从R

时间:2015-10-12 09:55:02

标签: r function dataframe

我遇到了以下问题。我有一个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

任何想法?

2 个答案:

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