[英]Adding new column using custom function in data frame using dplyr/data.table in R
我是R編程的新手,正在嘗試弄清楚如何使用自定義函數以高效內存的方式使用dplyr
或data.table
評估數據幀的新列。 有人可以幫忙嗎
這是我的問題的簡短摘要
數據框1和2具有相同的類型和列數
df1 <- data.frame(col1 = c("A", "B", "C"), col2 = c(10,20,30))
df2 <- data.frame(col1 = c("DA", "EE", "FB", "C"), col2 = c(10,20,30,40))
這些數據幀具有數百萬條記錄。
現在,我想通過使用df2中的值向數據幀之一(例如df1)添加新列。
library(dplyr)
calculateCol3 <- function(word) {
df2 %>%
filter(grepl(paste0(word, "$"),col1) )%>%
summarize(col3= sum(col2))
col3
}
df1 %>% group_by(col1) %>% mutate(col3 = calcualteCol3(col1))
此方法有效,但速度很慢,我猜這是因為復制數據集太多次了。 有人可以建議一種更好的方法嗎? 預期結果是:
col1 col2 col3
A 10 10
B 20 30
C 30 40
我還嘗試如下將數據幀轉換為data.table
dt1 <- data.table(df1)
dt2 <- data.table(df2)
dt1[, col3 := calculateCol3(col1)}, by = 1:nrow(dt1)]
一切似乎都很緩慢。 確保有更好的方法可以實現這一目標。 有人可以幫忙嗎
謝謝
如果您想要一個有效的解決方案,我建議您不要使用正則表達式,也不要按行操作。 如果您的所有功能只是通過最后一個字母進行連接,則可以不使用regex而獲得后者,然后使用data.table
進行二進制連接(以提高效率)
library(data.table)
setDT(df2)[, EndWith := substring(col1, nchar(as.character(col1)))]
setDT(df1)[df2, col3 := i.col2, on = .(col1 = EndWith)]
df1
# col1 col2 col3
# 1: A 10 10
# 2: B 20 30
# 3: C 30 40
現在,通過查看函數,似乎您還嘗試對每個連接的df2$col2
的值求和。 沒問題,您也可以在data.table
進行二進制連接時運行函數。 可以說這是您的df2
(僅用於說明每個字母的值是否大於一個)
df2 <- data.frame(col1 = c("DA", "FA", "EE", "FB", "C", "fC"), col2 = c(10,20,10,30,40,30))
df2
# col1 col2
# 1 DA 10
# 2 FA 20
# 3 EE 10
# 4 FB 30
# 5 C 40
# 6 fC 30
第一步是一樣的
setDT(df2)[, EndWith := substring(col1, nchar(as.character(col1)))]
雖然第二步將涉及二進制連接-正好相反,但是在添加時, by = .EACHI
並指定所需的函數
setDT(df2)[df1, .(col2 = i.col2, col3 = sum(col2)), on = .(EndWith = col1), by = .EACHI]
# EndWith col2 col3
# 1: A 10 30
# 2: B 20 30
# 3: C 30 70
我認為使用fuzzyjoin
包可以完成這項工作。 例如:
#install.packages("fuzzyjoin")
df1$col1regex <- paste0(df1$col1,"$")
regex_join(df2, df1, by=c(col1="col1regex"), mode="right")
# col1.x col2.x col1.y col2.y col1regex
#1 DA 10 A 10 A$
#2 FB 30 B 20 B$
#3 C 40 C 30 C$
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.