【问题标题】:How to select the first 3 rows and then add the fourth one (if any) till n-1如何选择前 3 行,然后添加第四行(如果有)直到 n-1
【发布时间】:2021-01-10 20:07:17
【问题描述】:

我想编写一个循环来处理具有 200 多个 data.frames 的大数据,每个 data.frame 有不同的行数。在每个 data.frame 中,我想选择前 3 行,然后进行分析。如果数据有第四行,我需要将它添加到第 3 行,然后如果数据有第五行,我需要将它添加到四行,依此类推,直到我得到 n-1 行。

例如,在第一个 data.frame 中,我有 n=6 行,我想选择前 3 行,然后进行分析(如预测和更多分析),然后将第四行添加到之前选择的 3 行,然后执行我的分析。

year <- c("1977", "1988", "1990", "2000", "2010", "2015")
y <- c(-0.12, -0.32, -0.23, -0.13, -0.4, -0.1)
s <- c(0.012, 0.023, 0.067, 0.076, 0.088, 0.003)
data <- data.frame(year, y, s)

所以我想将前 3 行处理为

  year     y     s
1 1977 -0.12 0.012
2 1988 -0.32 0.023
3 1990 -0.23 0.067

然后将第四行添加到之前选择的 3 行中,然后进行我的分析。

  year     y     s
1 1977 -0.12 0.012
2 1988 -0.32 0.023
3 1990 -0.23 0.067
4 2000 -0.13 0.076

然后将第五行添加到之前选择的 4 行中,然后进行我的分析。

  year     y     s
1 1977 -0.12 0.012
2 1988 -0.32 0.023
3 1990 -0.23 0.067
4 2000 -0.13 0.076
5 2010 -0.40 0.088

另一个 data.frame 有 n=33 行,所以我需要从前 3 行开始,然后进行分析,然后将第四行添加到前 3 行,然后进行分析,直到达到行号 n-1= 32 在最后一行之前(data.frame 有 n=33)。

通过 for 循环,我可以分别处理每个 data.frame,但对于每个 data.frame,我想要一种方法,如何仅选择前 3 行然后进行分析,然后添加新行直到第 n-1 行

【问题讨论】:

  • 不清楚预期。可能是,您需要lapply(3:(nrow(df1) -1), function(i) head(df1, i))。如果是 list 的 data.frames,则 lapply(lst1, function(dat) lapply(3:(nrow(dat)-1), function(i) head(dat, i)))
  • @akrun 谢谢,但我需要分别处理每个选定的行。
  • 如果您检查lapply3:(nrow(df1) -1),它会进行循环选择
  • 对不起,我没明白,例如,我怎样才能得到每个选定行的均值和方差?
  • 你的意思是'y'和's'?

标签: r


【解决方案1】:

使用循环尝试这种方法。结果显示有关数据框和用于计算的行数的信息:

# create sample data with name format data__x
for (i in 1:10){
  n=sample(5:50,1)
  assign(paste0("data__", i), data.frame(year=sample(1850:2020, n), 
                                         y=sample(seq(-0.5, 0, by=0.01), n),
                                         s=sample(seq(0, 1, by=0.001), n)))}
# get names by pattern 
data_names <- ls.str(pattern = "^data__\\d+")

# create empty results
results <- tibble(data=as.character(), n_rows=as.numeric(),  mean_y=as.numeric(), mean_s=as.numeric())

for (j in 1:length(data_names)) { # iterate over list of data.frames
  dt_name <- data_names[j]
  dt <- get(dt_name) # get value of variable by name
  
  for (i in 3:(nrow(dt)-1)) { # iterate over rows
    results[nrow(results) + 1, ] <- list(dt_name, i, mean(dt$y[1:i]), mean(dt$s[1:i])) # add row to results
  } 
}

输出:

# A tibble: 225 x 4
   data    n_rows mean_y mean_s
   <chr>    <dbl>  <dbl>  <dbl>
 1 data__1      3 -0.257  0.652
 2 data__1      4 -0.252  0.544
 3 data__1      5 -0.246  0.512
 4 data__1      6 -0.22   0.492
 5 data__1      7 -0.259  0.503
 6 data__1      8 -0.272  0.476
 7 data__1      9 -0.271  0.497
 8 data__1     10 -0.256  0.492
 9 data__1     11 -0.265  0.486
10 data__1     12 -0.247  0.448
# … with 215 more rows

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多