[英]Can someone explain the 'unexpected '='' message in my semi_join function in R when I use relative references?
我正在嘗試在R中構建一個腳本,該腳本將根據用戶輸入加入不同的字段。 我正在通過tidyverse(1.2.1)運行dplyr的0.7.6版本。
我可以構建多個基本相同的聯接語句,並根據輸入引用不同的聯接語句,但這似乎很不雅致。 以下是帶有注釋的示例。 我對R還是很陌生,所以如果這本身不太優雅,我深表歉意:
library(tidyverse)
df <- tibble(
a = letters[1:20],
b = c(1:5,1:5,1:5,1:5)
)
ref <- tibble(
let_ref_col = c('e','g','b','d','f'),
num_ref_col = c(2,4,NA,NA,NA)
)
df2 <- semi_join(df,ref,c('b'='num_ref_col'))
df3 <- semi_join(df,ref,c('b'=colnames(ref)[2]))
df2==df3 #just to check
df4 <- semi_join(df,ref,c(colnames(df)[2]=colnames(ref)[2]))
df2
將返回8行,其中df中的b列為2或4。
R似乎不介意讓我泛化第二個連接變量名,如df3所示。
當我嘗試將完全相同的邏輯應用於第一個變量時,我從df4
收到一條錯誤消息:
Error: unexpected '=' in "df4 <- inner_join(df,ref,c(colnames(df)[2]="
如果可能的話,我希望能夠對這兩個領域都有一個相對的參考。 就像是:
JOIN_DESIRED <- 2
df5 <- semi_join(df,ref,c(colnames(df)[JOIN_DESIRED] = colnames(ref)[JOIN_DESIRED])
可以將其更改為1,以字母代替數字。
這是一種解決方法。 我們可以使用names<-
來分配名稱。
df4 <- semi_join(df, ref, `names<-`(colnames(ref)[2], colnames(df)[2]))
identical(df2, df4)
# [1] TRUE
identical(df3, df4)
# [1] TRUE
在最后一行semi_join(df,ref,c(colnames(df)[2]=colnames(ref)[2]))
上,您正在一行上做很多事情。 特別是在此位: colnames(df)[2]=colnames(ref)[2]
有很多操作可能會違反R的惰性執行邏輯 。 這是我的編程方法:
library(tidyverse)
df <- tibble(
a = letters[1:20],
b = c(1:5,1:5,1:5,1:5)
)
ref <- tibble(
let_ref_col = c('e','g','b','d','f'),
num_ref_col = c(2,4,NA,NA,NA)
)
semi_join_by_column_index <- function(df1, df2, idx) {
original_name <- names(df1)[idx]
names(df1)[idx] <- "join_column"
names(df2)[idx] <- "join_column"
new_df <- semi_join(df1, df2, by = "join_column")
new_idx <- match("join_column", names(new_df))
names(new_df)[new_idx] <- original_name
return(new_df)
}
merged_df <- semi_join_by_column_index(df, ref, idx = 2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.