【问题标题】:Partical match string between columns for multiple dataframes多个数据框的列之间的部分匹配字符串
【发布时间】:2021-07-01 16:04:30
【问题描述】:

我有一个数据框列表(df1、df2、df3),我想将列与另一个数据框(df)进行匹配,并且仅在匹配时替换字符串。匹配应该基于运行函数时指定的字符串,指定为部分匹配,换句话说,这里它仅适用于包含字符串“TEXT”的字段,并且应该适用于 TEXT123 和 TEXTabc 等情况。我自己也没走多远……

df1 <- data.frame(name = c("TEXT333","b","c"), column_A = 1:3, stringsAsFactors=FALSE)
df2 <- data.frame(name = c("b","TEXT345","d"), column_A = 4:6, stringsAsFactors=FALSE)
df3 <- data.frame(name = c("c","TEXT123","a"), column_A = 7:9, stringsAsFactors=FALSE)
df <- data.frame(name = c("TEXT333","TEXT123","a", "TEXT345", "k", "l", "b","c", "f"), column_B = 11:19, stringsAsFactors=FALSE)


list<-c(df1, df2, df3)

df1 示例

partial_match <- function(column_A$df1, column_B, TEXT, df) {
  df1_new <-df1
  df1_new[, column_B] <- ifelse(grepl("TEXT.*", df1[, column_A]),
                           df[, column_B] - nchar(TEXT),
                           df[, column_B])
  df1_new
}

df1 的结果:

name column_A column_B
TEXT333        1        11
b        2        b
c        3        c

【问题讨论】:

  • 一些样本数据和所需的输出会有所帮助
  • 上传了一个样本

标签: r dataframe match substitution partial


【解决方案1】:

这是使用 for 循环的一种方法。你很亲近!请注意,我将您的参考数据框名称更改为 dfs 以避免与 list() 混淆。

您是否认为您可能会遇到在同一个数据帧中匹配多次的情况?如果是这样,如果没有更多的行,我在下面显示的内容将无法正常工作。

df1 <- data.frame(name = c("TEXT333","b","c"), column_A = 1:3, stringsAsFactors=FALSE)
df2 <- data.frame(name = c("b","TEXT345","d"), column_A = 4:6, stringsAsFactors=FALSE)
df3 <- data.frame(name = c("c","TEXT123","a"), column_A = 7:9, stringsAsFactors=FALSE)
dfs <- list(df1, df2, df3)
df <- data.frame(name = c("TEXT333","TEXT123","a", "TEXT345", "k", "l", "b","c", "f"), column_B = 11:19, stringsAsFactors=FALSE)

# loop over all dataframes in your list
for(i in 1:length(dfs)){
  
  # get name that matches regex
  val <- grep(pattern = "*TEXT*", x = dfs[[i]]$name, value = TRUE)
  
  # use name to update value from reference df
  dfs[[i]][dfs[[i]]$name == val,"column_A"] <- df[df$name == val,"column_B"]
}

更新的答案可以解释同一 df 中的多个匹配项

for(i in 1:length(dfs)){
  vals <- grep(pattern = "*TEXT*", x = dfs[[i]]$name, value = TRUE)
  for(val in vals){
    dfs[[i]][dfs[[i]]$name == val, "column_A"] <- df[df$name == val,"column_B"]
  }
}

【讨论】:

  • 是的,会有多个匹配,所以需要另一个解决方案:)
  • 我更新了我的答案以适应同一个 df 中的多个匹配项。如果有任何问题,请告诉我。
  • 我认为它有效,只需要弄清楚如何输出这些数据帧,例如df[i]
  • 一种快速而肮脏的方式...for(i in 1:length(dfs)){assign(x = paste0("df_result_", i), value = dfs[[i]])}
  • 它以某种方式与示例一起工作,但在真实案例中给出了缺失值
猜你喜欢
  • 2020-11-28
  • 2017-10-01
  • 2021-08-22
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多