【问题标题】:Summarize values in strings in one variable based on positions of related values in another variable根据另一个变量中相关值的位置汇总一个变量中字符串中的值
【发布时间】:2021-03-11 09:11:55
【问题描述】:

我有这种类型的数据:

df <- data.frame(
  A_aoi = c("C*BB*B", "C*B*C*", "B**", "C*B"),
  A_dur = c("234,312,222,3456,1112,77", "12,13,14,15,11,1654", "896,45222,55", "5554,322,142"),
  B_aoi = c("**ACC", "AC*", "AAA", "C*A*"),
  B_dur =c("12,13,15,100,100", "14,55,66", "88,99,100", "1,2,3,4")
)

我需要做的是在列A_durB_dur 中汇总那些在字符串中具有相同位置 的值作为列A_aoiA_aoiB_aoi 中重复的游程长度.

现在'位置'可以被索引捕获,这就是为什么我首先在​​所有列中拆分字符串:

library(stringr)
df[,c(1,3)] <- lapply(df[,c(1,3)], function(x) str_split(x, ""))
df[,c(2,4)] <- lapply(df[,c(2,4)], function(x) str_split(x, ","))

然后我在 A_aoiB_aoi 列中获得运行长度重复的索引:

library(dplyr)
df$index_A_aoi <-  sapply(df$A_aoi, function(x) which(x == lead(x)))
df$index_B_aoi <-  sapply(df$B_aoi, function(x) which(x == lead(x)))

现在,当我尝试根据 index_A_aoiindex_B_aoisapply 中的索引来总结 A_durB_dur 中的值时,我卡住了:

sapply(as.numeric(df$A_dur), function(x) x[df$index_A_aoi] + lead(x[df$index_A_aoi]))
Error in lapply(X = X, FUN = FUN, ...) : 
  'list' object cannot be coerced to type 'double'

预期结果

df
   A_aoi                A_dur B_aoi     B_dur
1 C*BB*B 234,312,3678,1112,77 **ACC 25,15,200
2 C*B*C*  12,13,14,15,11,1654   AC*  14,55,66
3    B**            896,45277   AAA       287
4    C*B         5554,322,142  C*A*   1,2,3,4

我乐于接受并感谢任何解决方案,包括 dplyr 解决方案。

【问题讨论】:

  • 抱歉忘记接受您的回答,很好用!谢谢!

标签: r dplyr sapply


【解决方案1】:

这是一个借助 data.table 的 rleid 函数的解决方案

library(data.table)

calculate <- function(p, q) {
  mapply(function(x, y) toString(tapply(as.numeric(x), rleid(y), sum)), 
      strsplit(p, ','), strsplit(q, ''))
}

aoi_cols <- grep('aoi', names(df))
dur_cols <- grep('dur', names(df))
df[dur_cols] <- Map(calculate, df[dur_cols], df[aoi_cols])
df

#   A_aoi                    A_dur B_aoi       B_dur
#1 C*BB*B 234, 312, 3678, 1112, 77 **ACC 25, 15, 200
#2 C*B*C* 12, 13, 14, 15, 11, 1654   AC*  14, 55, 66
#3    B**               896, 45277   AAA         287
#4    C*B           5554, 322, 142  C*A*  1, 2, 3, 4

calculate 函数将一对列拆分为逗号dur 和每个字符上的aoi,并使用rleid 创建连续出现的值组和sum 它们。我们对数据集中的所有此类对应用calculate 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多