当前位置: 首页 > 知识库问答 >
问题:

基于R中的部分字符串匹配(在另一个数据帧中)替换数据帧中的NAs

江阳羽
2023-03-14

目标:基于另一个数据帧中的“键”更改一个数据帧中的NAs列(类似于VLookUp,但仅在R中除外)

这里给定df1(为了简单起见,我只有6行。我拥有的键是50个状态的50行):

这里给出了df2(这只是一个示例。我正在处理的真实数据帧有更多的行):

任务:创建一个R函数,该函数循环并读取每个df2$Article行中的状态;然后将其与df1$State\u Name交叉引用,根据df2$Article中的状态,用相应的df1$缩写键替换df2$State中的NAs。我知道这有点过分。我一直在思考如何开始和完成这个难题。硬编码不是一个选项,因为我的真实数据表中有数千行这样的内容,随着我们向文本摘要中添加更多文章,硬编码将不断更新。

输出应如下所示:

注意:带有DC的第五个条目旨在为NA。

非常感谢您提供指南链接和/或关于如何编写代码的任何建议。非常感谢。

共有2个答案

庾和昶
2023-03-14

没有上面那么简洁,而是基本R方法

# Unlist handling 0 length vectors: list_2_vec => function()
list_2_vec <- function(lst){
  # Coerce 0 length vectors to na values of the appropriate type: 
  # .zero_to_nas => function()
  .zero_to_nas <- function(x){
    if(identical(x, character(0))){
      NA_character_ 
    }else if(identical(x, integer(0))){
      NA_integer_
    }else if(identical(x, numeric(0))){
      NA_real_
    }else if(identical(x, complex(0))){
      NA_complex_
    }else if(identical(x, logical(0))){
      NA
    }else{
      x
    }
  }
  # Unlist cleaned list: res => vector
  res <- unlist(lapply(lst, .zero_to_nas))
  # Explictly define return object: vector => GlobalEnv()
  return(res)
}

# Classify each article as belonging to the appropriate state: 
# clean_df => data.frame
clean_df <- transform(
  df2,
  State = df1$Abbreviation[
    match(
      list_2_vec(
        regmatches(
          Article, 
          gregexpr(
            paste0(df1$State_Name, collapse = "|"), Article
          )
        )
      ),
      df1$State_Name
    )
  ]
)

# Data: 
df1 <- structure(list(Index = 1:6, State_Name = c("California", "Maryland", 
"New York", "Texas", "Virginia", "Washington"), Abbreviation = c("CA", 
"MD", "NY", "TX", "VA", "WA")), class = "data.frame", row.names = c(NA, -6L))

df2 <- structure(list(Index = 1:6, State = c(NA, NA, NA, NA, NA, NA), 
Article = c("Texas governor, Abbott, signs new abortion bill", 
"Effort to recall California governor Newsome loses steam", 
"New York governor, Cuomo, accused of manipulating Covid-19 nursing home data", 
"Hogan (Maryland, R) announces plans to lift statewide Covid restrictions", 
"DC statehood unlikely as Manchin opposes", "Amazon HQ2 causing housing prices to soar in northern Virginia"
)), class = "data.frame", row.names = c(NA, -6L))
邴俊达
2023-03-14

您可以从State\u Name创建正则表达式模式,并使用str\u extract从文章中提取。使用匹配从df1中获取相应的缩写名称。

library(stringr)

df2$State <- df1$Abbreviation[match(str_extract(df2$Article, 
               str_c(df1$State_Name, collapse = '|')), df1$State_Name)]
df2$State
#[1] "TX" "CA" "NY" "MD" NA   "VA"

您还可以使用内置的state.namestate.abb而不是df1来获取州名和缩写。

这里有一种在循环中执行此操作的方法-

for(i in seq(nrow(df1))) {
  inds <- grep(df1$State_Name[i], df2$Article)
  if(length(inds)) df2$State[inds] <- df1$Abbreviation[i]
}
df2

#  Index State                                                                      Article
#1     1    TX                              Texas governor, Abbott, signs new abortion bill
#2     2    CA                     Effort to recall California governor Newsome loses steam
#3     3    NY New York governor, Cuomo, accused of manipulating Covid-19 nursing home data
#4     4    MD     Hogan (Maryland, R) announces plans to lift statewide Covid restrictions
#5     5  <NA>                                     DC statehood unlikely as Manchin opposes
#6     6    VA               Amazon HQ2 causing housing prices to soar in northern Virginia
 类似资料:
  • 我有一个关于熊猫以及正确索引和替换值的问题。 我有两个数据帧,df1和df2,具有相同的列(Col1、Col2、Col3和Col4)。 在df1中,我想用另一个值(比如100)替换与df2中其他列(Col1、Col2和Col3)的值匹配的行中Col4中的值。 生成的df1看起来像这样: 我试过这样的方法: 但是我得到了错误,我不确定这是否达到了我想要的。

  • 我有两个数据帧df1和df2。df1就像一个具有以下值的字典 df2具有以下值: 我想基于df1数据帧中的,将df2拆分为3个新的数据帧。 日期,TLRA_权益栏应位于数据框 预期产出: > 数据帧 消费者,非周期性数据帧 请让我知道如何有效地做。我想做的是连接列名,例如,然后根据列名的前半部分分割数据帧。 代码: 但这很复杂。需要更好的解决方案。

  • 我和Spark一起在Databricks上工作。编程语言是Scala。 我有两个数据帧: 主数据框:见截图:1 查找数据帧:参见屏幕截图3 我想: 查找主数据框中“年龄”=-1的所有行 我对如何做这件事伤了脑筋。我唯一想到的是将dataframe存储为DataRicks中的表,并使用SQL语句(SQL.Context.SQL…),结果非常复杂。 我想知道是否有更有效的方法。 编辑:添加可复制的示例

  • 我正在改装一些现有代码以使用Spark。我有多个包含不同数据集的数据帧。在转换主数据帧(或主数据集)时,我需要使用来自其他数据帧的数据来完成转换。我还有一种情况(至少在当前结构中),我需要在另一个数据帧的转换函数中创建新的数据帧。 我试图确定以下内容: 我可以在另一个数据帧的转换函数中访问数据帧吗 关于如何处理这种情况的指针将非常有帮助。

  • 我有两个具有经度和纬度值的数据帧,我想从数据帧#2中提取值(例如数据帧#2的第三列),这些值与数据帧1的列匹配...例如,数据帧1有两列(、),数据帧2有三列(、和一些值)...我想在数据帧1中添加第三列,其中的值对应于两个数据帧中两列完全匹配的值,类似于和...在、不匹配的对中,我希望添加,以便第三列(我要添加到数据。帧1)的长度为=。我尝试了merge函数,但在将的两列与的列进行匹配时遇到了困

  • 我有2个熊猫数据框 df1= df2= 我想使用df2“类”列中的可能值搜索df1中的“课程”列,然后返回适当的合计权重。 这是我目前所知道的 导致 我怎样才能得到这样的东西 任何帮助都将不胜感激。谢谢