【问题标题】:Looping over a list to extract value in R循环遍历列表以提取 R 中的值
【发布时间】:2020-08-15 08:49:37
【问题描述】:

我是 R 编程新手,试图编写一个循环来从包含数据帧的列表中提取一个数字。但是,我似乎无法正确地对列表进行子集化。这可能是基本的,但现在它让我发疯了!

df1 <- tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), c=c("alpha", "beta","alpha", "beta", "alpha"))
df2 <- tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), c=c("alpha", "beta","alpha", "beta", "alpha"))
df3 <- tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), c=c("alpha", "beta","alpha", "beta", "alpha"))
df4 <- tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), c=c("alpha", "beta","alpha", "beta", "alpha"))

list <- c(df1, df2, df3, df4)
res  <- vector("numeric",4)
df2[[2,2]]

for (i in list){
res[i] <- i[[2,2]]

}

我得到这个(和类似的)错误; “i[[2, 2]] 中的错误:下标数不正确”

感谢您的帮助。

【问题讨论】:

  • (1) 将变量命名为 list 并不好,如果您的意思是命名为 list 的变量或命名为 list 的原始函数,这并不总是很清楚。 (2) 在您的for 循环中,i 是一个tbl_df,因此应该应用“正常”帧索引,即[。 (3) [[ 通常用于单个元素。 (99) 我不知道你想在这里做什么,但也许i[2,2] 是你需要的? (注意它会返回一个tbl_df,1行1列。)
  • 好的,我明白了。您需要查看您的 list 对象:它不是四个帧/小标题的列表,它是一个 list(原始 R),具有 12 个名为 "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c"(是的,重复)的元素,每个元素都是一个向量。
  • 我认为您的意思是 list &lt;- list(df1, df2, df3, df4) ...但我真的鼓励您将其命名为 list 以外的其他名称。
  • JML,如果其中一个答案解决了您的问题,请accept it;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。尽管您只能接受一个答案,但您可以选择对您认为有帮助的人进行投票。 (如果仍有问题,您可能需要编辑您的问题并提供更多详细信息。)
  • 感谢您的提示,r2evans!这也是新的;)

标签: r for-loop


【解决方案1】:

我想您正试图在列表中的每个数据框中挑选出第二列的第二行:

library(tidyverse)

res <- list(df1 = tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), 
                         c=c("alpha", "beta","alpha", "beta", "alpha")),
            df2 = tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), 
                         c=c("alpha", "beta","alpha", "beta", "alpha")),
            df3 = tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), 
                         c=c("alpha", "beta","alpha", "beta", "alpha")),
            df4 = tibble("a"=c(1,2,3,4,5), "b"=c(22,23,24,25,26), 
                         c=c("alpha", "beta","alpha", "beta", "alpha"))) %>%
  # if you want the answer in a dataframe
  purrr::map_df(~ .x %>% 
                  dplyr::select(2) %>% # Pick the second column
                  dplyr::slice(2)) %>% # Pick the second row's value

  unlist() # if you want it as a vector
> res
b1 b2 b3 b4 
23 23 23 23 

【讨论】:

    【解决方案2】:

    (在前面,我将使用mylist 而不是list。)

    您的数据不是您尝试使用的帧列表。

    mylist <- c(df1, df2, df3, df4)
    str(mylist)
    # List of 12
    #  $ a: num [1:5] 1 2 3 4 5
    #  $ b: num [1:5] 22 23 24 25 26
    #  $ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
    #  $ a: num [1:5] 1 2 3 4 5
    #  $ b: num [1:5] 22 23 24 25 26
    #  $ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
    #  $ a: num [1:5] 1 2 3 4 5
    #  $ b: num [1:5] 22 23 24 25 26
    #  $ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
    #  $ a: num [1:5] 1 2 3 4 5
    #  $ b: num [1:5] 22 23 24 25 26
    #  $ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
    

    改为使用list:

    mylist <- list(df1, df2, df3, df4)
    str(mylist)
    # List of 4
    #  $ :Classes 'tbl_df', 'tbl' and 'data.frame': 5 obs. of  3 variables:
    #   ..$ a: num [1:5] 1 2 3 4 5
    #   ..$ b: num [1:5] 22 23 24 25 26
    #   ..$ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
    #  $ :Classes 'tbl_df', 'tbl' and 'data.frame': 5 obs. of  3 variables:
    #   ..$ a: num [1:5] 1 2 3 4 5
    #   ..$ b: num [1:5] 22 23 24 25 26
    #   ..$ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
    #  $ :Classes 'tbl_df', 'tbl' and 'data.frame': 5 obs. of  3 variables:
    #   ..$ a: num [1:5] 1 2 3 4 5
    #   ..$ b: num [1:5] 22 23 24 25 26
    #   ..$ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
    #  $ :Classes 'tbl_df', 'tbl' and 'data.frame': 5 obs. of  3 variables:
    #   ..$ a: num [1:5] 1 2 3 4 5
    #   ..$ b: num [1:5] 22 23 24 25 26
    #   ..$ c: chr [1:5] "alpha" "beta" "alpha" "beta" ...
    for (i in mylist) { print(i[[2,2]]); break; }
    # [1] 23
    

    (名义上的for 循环只是为了证明i[[2,2]] 确实有效。)


    根据您的预期用途,一些工作示例:

    res <- sapply(mylist, function(x) x[[2,2]])
    res
    # [1] 23 23 23 23
    
    ### identical results, might be more obscure (and perhaps less flexible)
    res <- sapply(mylist, `[[`, c(2, 2))
    
    ### identical results, less R-idiomatic
    res <- vector("numeric", 4)
    for (i in seq_along(mylist)) { res[[i]] <- mylist[[i]][[2,2]]; }
    res
    

    【讨论】:

    • 感谢您的精彩提示!但是,当我尝试将给定值保存在结果向量中时,我不断收到错误消息“res [i]
    • res[df2] 不是向量的有效元素。请改用res[2]
    • for (i in seq_along(mylist)) { res[i] &lt;- mylist[[i]][[2,2]]; } 或许。
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    相关资源
    最近更新 更多