【问题标题】:Extracting multiple substrings and returning a value for each substring提取多个子字符串并为每个子字符串返回一个值
【发布时间】:2018-05-10 17:42:07
【问题描述】:

我想找到一个优雅的方法:

  1. 从 df1 的每一行中提取多个子字符串
  2. 将每行的多个子字符串存储为向量或列表
  3. 为 df1 中的每个行向量返回一个值

我有两个数据框:

n = c("Canada and USA", "USA and Mexico", "Canada and Mexico")
df1 = data.frame(n)

m = c("Canada", "USA", "Mexico")
o = c(5, 8, 7)
df2= data.frame(m, o)

我生成的数据框如下所示:

n = c("Canada and USA", "USA and Mexico", "Canada and Mexico")
p = c(13, 15, 12)
df3 = data.frame(n, p)

其中向量“p”的值是向量“o”中与向量“n”相对应的元素的总和。

注意:我只是在寻找一种方法,所以我可能会解决这个问题。

目前,我坚持使用 lapply 和正则表达式从 df1 中提取多个子字符串,并且不知道如何存储子字符串,无论是在列表中还是在另一个数据框中。

对于如何解决该问题的任何想法和建议将不胜感激,因为我想花时间充分了解解决此问题背后的机制。

提前谢谢你!

已编辑:用于格式化

【问题讨论】:

  • 试试strsplit(as.character(df1$n), " and ")
  • 你的结果总和是p 对吗?我没有得到这些值(不是按那个顺序)。
  • @Pieca,strsplit 是个好主意,但如果 df1 可能在字符串中包含其他填充词,则可能没有帮助。
  • @RuiBarradas,P 是子串组合的 O 的结果总和 :)

标签: r


【解决方案1】:

也许以下内容会满足您的需求。
首先,创建一个索引矩阵,匹配的索引为df2$m。然后使用索引矩阵对df2$o中的值求和。

inx <- sapply(df2$m, function(s) grep(s, df1$n))
df4 <- data.frame(n, p = apply(inx, 2, function(i) sum(df2$o[i])))

df4
#                  n  p
#1    Canada and USA 12
#2    USA and Mexico 13
#3 Canada and Mexico 15

【讨论】:

  • grep(s, df1$n) 中的's'代表模式变量吗?
  • @Runner 是的,确实如此。该指令读取应用到向量df2$m 函数grep(etc) 的每个元素s。我选择了s,因为它是一个字符串,也许p for pattern会更好。
  • sapply 函数在参数 'pattern' 的长度 >1 时出现错误。我错过了这里的步骤或库文件吗?抱歉,我对 R 有点陌生。
  • @Runner sapply 将向量df2$m 的一个元素传递给函数,您如何获得长度> 1 的模式?请您发布您正在运行的代码和错误消息吗?
  • @RuiBarradas- 'inx 1 并且只使用第一个元素 2: 在 base::grep(pattern = pattern, x = x , ignore.case = ignore.case, : 参数 'pattern' 的长度 > 1 并且只使用第一个元素 3: 在 base::grep(pattern = pattern, x = x, ignore.case = ignore.case, : 参数 'pattern' 的长度 > 1 并且只使用第一个元素'
猜你喜欢
  • 1970-01-01
  • 2021-01-09
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
相关资源
最近更新 更多