簡體   English   中英

當我使用相對引用時,有人可以在R的semi_join函數中解釋“意外的'=”消息嗎?

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

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