簡體   English   中英

在 R 中循環遍歷 dataframe 的不同子集

[英]Looping across varying subsets of a dataframe in R

我在 R 中有一個 dataframe 看起來像這樣:

library(tibble)

df <- tribble(~Word1, ~Word2, ~distance, ~speaker, ~session,
          "WordA", "WordX", 0.14, "JB", 1,
          "WordB", "WordY", 0.21, "JB", 1,
          "WordC", "WordZ", 0.47, "JB", 1,
          "WordX", "WordA", 0.23, "JB", 1,
          "WordY", "WordB", 0.78, "JB", 1,
          "WordZ", "WordC", 0.51, "JB", 1)

我想創建一個元素列表,其中計算因距離而異的數據。 例如,我對數據進行了以下計算,子集distance < 1

df %>%
    filter(distance < 0.1) %>%
    group_by(speaker, session, Word1) %>%
    tally()     # for each item in Word1, how many times does Word2 have a distance <1?

我想對 0-1 的不同距離執行此操作,增量為 0.001。 使用這個查詢,我已經做到了這一點:

threshold_list <- seq(from = 0, to = 1, by = 0.01)  # create an empty list with 101 elements
thresholds <- seq(from = 0, to = 1, by = 0.01)      # create a df with distance thresholds
 
for(t in 1:thresholds){
    threshold_list[[t]] <- filter(df, distance < t) %>% 
    group_by(speaker, session, Word1) %>% 
    tally() 
}

當我運行它時,我得到了錯誤

threshold_list[[t]] <- filter(df, distance < t) %>% group_by(speaker, : 提供的元素多於要替換的元素另外:警告消息:在 1:閾值中:數值表達式有 101 個元素: 只有第一個使用

我認為這與列表threshold_list和 df thresholds之間缺乏匹配有關,但我是循環的新手,對於如何前進有點卡住了!

我不確定我是否理解您嘗試應用於這些子集的功能,但希望這種在子集數據上運行 function 的邏輯保持不變。

所以我在我的解決方案中所做的是使用嵌套來完成子集。

Hadley Wickham 在 R for Data Science 的嵌套章節中討論了這個邏輯

本質上,我們在 dataframe 中創建數據幀,並將 function 分別應用於每個數據幀。

因此,在下面我從您提供的示例表開始。 我創建了一個距離度量,允許您根據 0.001 的增量對結果進行分組。 然后我將數據嵌套在那個新的距離度量上。 所以這里是我們為每個距離切割度量創建一個數據框的地方

然后我們可以使用 purrr::map 將計數 function 應用於每個數據幀中的所有內容。

與所有循環相比,我更喜歡這種方法,因為代碼最終變得更干凈,更容易推理。

library(tibble)
library(dplyr)
library(purrr)

df <- tribble(~Word1, ~Word2, ~distance, ~speaker, ~session,
              "WordA", "WordX", 0.14, "JB", 1,
              "WordA", "WordY", 0.14, "JB", 1,
              "WordB", "WordY", 0.21, "JB", 1,
              "WordC", "WordZ", 0.47, "JB", 1,
              "WordX", "WordA", 0.23, "JB", 1,
              "WordY", "WordB", 0.78, "JB", 1,
              "WordZ", "WordC", 0.51, "JB", 1)


df_2 <- df %>% 
        mutate(distance_cut = as.numeric(cut(distance, 
                                  breaks = c(seq(0, 1, by =  0.001)))) / 1000)

df_2 <- df_2 %>% 
        group_by(distance_cut) %>% 
        nest()


grouped_tally <- function(d) {
        d %>% 
                group_by(speaker, session, Word1) %>%  
                tally()
}

df_2 <- df_2 %>% 
        mutate(results = map(data, grouped_tally))

unnest(df_2, results)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM