[英]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.