簡體   English   中英

使用R中的dplyr / data.table在數據框中使用自定義功能添加新列

[英]Adding new column using custom function in data frame using dplyr/data.table in R

我是R編程的新手,正在嘗試弄清楚如何使用自定義函數以高效內存的方式使用dplyrdata.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.

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