代码之家  ›  专栏  ›  技术社区  ›  bill999

如何在R循环中引用其他内容

  •  0
  • bill999  · 技术社区  · 5 年前

    假设我有这些数据:

    library(dplyr)
    data <- data.frame(num=c(1:6), val=c('1998-99', '1999-00', '2000-01', '2001-02', '2002-03', '2003-04'))
    

    然后,我有几个有用的东西可以弄清楚,主要是关于循环中的值如何引用其他值以及如何自动化这个过程。

    最好把它放在一个循环中。如何处理数据帧名称?换句话说,如何在循环中引用data.frame的名称?

    data03 <- filter(data, num<=1)
    data04 <- filter(data, num<=2)
    data05 <- filter(data, num<=3)
    data06 <- filter(data, num<=4)
    data07 <- filter(data, num<=5)
    data08 <- filter(data, num<=6)
    

    那么,如何使这个循环工作并简化呢?

    for (i in c(03, 04, 05, 06, 07, 08)) {
        #I want to print the number corresponding to i
        if(i=="03") print(1)
        if(i=="04") print(2)
        if(i=="05") print(3)
        if(i=="06") print(4)
        if(i=="07") print(5)
        if(i=="08") print(6)
        #I want to get the value corresponding to i for the plot title
        if(i=="03") title="1998-99"
        if(i=="04") title="1999-00"
        if(i=="05") title="2000-01"
        if(i=="06") title="2001-02"
        if(i=="07") title="2002-03"
        if(i=="08") title="2003-04"
        #I want to open the data frame, data+i
        df <- paste(data,i) 
        #I want to plot, using the title saved above
        plot(df$num, main=title)
    }
    
    3 回复  |  直到 5 年前
        1
  •  2
  •   www    5 年前

    你不需要一个for循环。你可以用 lapply 输出是一个列表,您可以进一步使用 勒普 用于后续分析。

    lapply(1:6, function(x) data %>% filter(num <= x))
    # [[1]]
    #   num     val
    # 1   1 1998-99
    # 
    # [[2]]
    #   num     val
    # 1   1 1998-99
    # 2   2 1999-00
    # 
    # [[3]]
    #   num     val
    # 1   1 1998-99
    # 2   2 1999-00
    # 3   3 2000-01
    # 
    # [[4]]
    #   num     val
    # 1   1 1998-99
    # 2   2 1999-00
    # 3   3 2000-01
    # 4   4 2001-02
    # 
    # [[5]]
    #   num     val
    # 1   1 1998-99
    # 2   2 1999-00
    # 3   3 2000-01
    # 4   4 2001-02
    # 5   5 2002-03
    # 
    # [[6]]
    #   num     val
    # 1   1 1998-99
    # 2   2 1999-00
    # 3   3 2000-01
    # 4   4 2001-02
    # 5   5 2002-03
    # 6   6 2003-04
    

    下面是完整的代码来过滤数据帧,然后创建绘图。

    dat <- lapply(1:6, function(x) data %>% filter(num <= x))
    
    lapply(dat, function(x){
      plot(x$num, main = x$val[nrow(x)])
    })
    
        2
  •  1
  •   John Siryj    5 年前

    因此,如果我了解您的问题,您将询问如何在不引用data.frame元素名称的情况下引用它们。

    在这种情况下,假设您有data.frame test.df 我们可以用 [[]] 像这样接近他们

    test.df <- data.frame(first=rnorm(10),second=rnorm(10))
    test.df$first
    [1]  0.8447835 -0.7210152 -1.6379253 -1.5695393 -1.2467788 -1.9273583  0.5633265 -0.4186060  1.3478030 -0.4379999
    test.df[[1]]
    [1]  0.8447835 -0.7210152 -1.6379253 -1.5695393 -1.2467788 -1.9273583  0.5633265 -0.4186060  1.3478030 -0.4379999
    test.df$first == test.df[[1]]
    [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
    

    然后,您可以使用此索引进行循环。

    更具体地说,如果您只想打印带有VAL标题的数字,您可以这样做。

    for(i in 1:length(data$num){
       plot(data$num[[i]],main=paste(data$val[[i]])
    
        3
  •  1
  •   bpbutti    5 年前

    也许有一种更好的方法来解决这个问题,而不是你如何去做,但是为了使你的想法有效,你只需要得到一个列表中的数据帧,并迭代它的索引。

    library(dplyr)
    data <- data.frame(num=c(1:6), val=c('1998-99', '1999-00', '2000-01', '2001-02', '2002-03', '2003-04'))
    
    data_lst <- list(
      data03 = filter(data, num<=1),
      data04 = filter(data, num<=2),
      data05 = filter(data, num<=3),
      data06 = filter(data, num<=4),
      data07 = filter(data, num<=5),
      data08 = filter(data, num<=6))
    
    for (i in seq_along(data_lst)) {
      print(i)
      title = data[2][-1]
      print(title)
      df <- data_lst[[i]]
      plot(df$num, main=title)
    }