0

我有一个小问题。我有一个包含 8208 行数据的数据集。这是单列数据,我想将每 n 行作为一个块并将其添加到新数据框中。

因此,例如:

newdf 有第 1 列到第 23 列。

第 1 列由原始数据集的第 289:528 行组成 第 2 列由原始数据集的第 625:864 行组成

等等。“块”大小为 239 行,块之间的跳转是每 336 行。

我可以手动执行此操作,但这会变得乏味。我必须对另外 11 组数据重复整个过程,所以显然更自动化的方法会更好。

4

4 回答 4

2

更新

请注意,OP 声明块大小为 239 个元素,但从示例行中可以清楚地看出块大小为 240

> length(289:528)
[1] 240

我将在下面的示例中保留 239 的块长度,但如果它真的是 240,请进行调整。


从问题中不清楚,但假设你有这样的东西

df <- data.frame(A = runif(8208))

一个有 8208 行的数据框。

首先计算A您需要保留的元素的索引。这是通过

want <- sapply(seq(289, nrow(df)-239, by = 336),
               function(x) x + (seq_len(239) - 1))

然后我们可以使用 R 按列填充矩阵并将所需元素转换为A具有 239 行的矩阵的事实

mat <- matrix(df$A[want], nrow = 239)

这有效

> all.equal(mat[,1], df$A[289:527])
[1] TRUE

但请注意,我在这里采用了 239 的块长度(289:527)而不是 OP 引用的索引,因为这是 240 的块大小(参见上面的更新)

如果你想要这是一个数据框,只需添加

df2 <- as.data.frame(mat)
于 2013-07-02T15:36:57.620 回答
2

这里的技巧是创建一个整数索引,该索引引用您要保留的行号。这很简单,只需使用rep, 序列和 R 的回收规则。

让我演示一下使用iris. 假设您要跳过 25 行,然后返回 3 行:

skip <- 25
take <- 3

total <- nrow(iris)
reps <- total %/% (skip + take)
index <- rep(0:(reps-1), each=take) * (skip + take) + (1:take) + skip

现在的指数是:

index
 [1]  26  27  28  54  55  56  82  83  84 110 111 112 138 139 140

和行iris

iris[index, ]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
26           5.0         3.0          1.6         0.2     setosa
27           5.0         3.4          1.6         0.4     setosa
28           5.2         3.5          1.5         0.2     setosa
54           5.5         2.3          4.0         1.3 versicolor
55           6.5         2.8          4.6         1.5 versicolor
56           5.7         2.8          4.5         1.3 versicolor
82           5.5         2.4          3.7         1.0 versicolor
83           5.8         2.7          3.9         1.2 versicolor
84           6.0         2.7          5.1         1.6 versicolor
110          7.2         3.6          6.1         2.5  virginica
111          6.5         3.2          5.1         2.0  virginica
112          6.4         2.7          5.3         1.9  virginica
138          6.4         3.1          5.5         1.8  virginica
139          6.0         3.0          4.8         1.8  virginica
140          6.9         3.1          5.4         2.1  virginica
于 2013-07-02T15:36:59.847 回答
1

为什么不只是:

 as.dataframe(matrix(orig, nrow=528 )[289:528 ,])

由于 8028 不是行数的精确倍数,我们需要确定列:

> 8208/528
[1] 15.54545 # so either 15 or 16
> 8208-15*528
[1] 288  # all in the to-be-discarded section

as.dataframe(matrix(orig, nrow=528, col=15 )[289:528 ,])

或者:

as.dataframe(matrix(orig, nrow=528, col=8208 %/% 528)[289:528 ,])
于 2013-07-02T17:35:48.837 回答
1

尝试这个:

1) 创建索引列表

lapply(seq(1, 8208, 336), function(X) X:(X+239)) -> Indices

2) 选择数据

Columns <- lapply(Indices, function(X) OldDF[X,])

3)在列中组合选定的数据

NewDF <- do.call(cbind, Columns)
于 2013-07-02T15:36:30.837 回答