r-总结出现"NA"时字符串重复的持续时间



我在A_aoiB_aoi列中有注视方向数据,在A_durB_dur列中有各自的注视持续时间:

df <- data.frame(
id = 1:4,
A_aoi = c("C*BB*B", "C*BCCC", "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", "1,2,3", "88,99,100", "1,2,3,4")
)

在某些情况下,存在两个或两个以上直接相邻的重复项(即,相同类型的测量(;例如,第一个A_aoi值包含字符串BB,第二个值包含CCC

我需要总结一下这些副本的持续时间。借助上一个问题中的代码,根据一个变量中相关值的位置,在一个变量的字符串中汇总值,我可以完成以下任务:

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
id  A_aoi                    A_dur B_aoi       B_dur
1  1 C*BB*B 234, 312, 3678, 1112, 77 **ACC 25, 15, 200
2  2 C*BCCC         12, 13, 14, 1680   AC*     1, 2, 3
3  3    B**               896, 45277   AAA         287
4  4    C*B           5554, 322, 142  C*A*  1, 2, 3, 4

但是:在我的实际数据中,有NA值。例如,在这个稍微修改过的df中,我在列B_dur中添加了一个NA值,代码抛出一个错误:

df <- data.frame(
id = 1:4,
A_aoi = c("C*BB*B", "C*BCCC", "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", NA, "88,99,100", "1,2,3,4")
)

即使在有NA的情况下,如何完成任务,结果如下:

df
id  A_aoi                    A_dur B_aoi       B_dur
1  1 C*BB*B 234, 312, 3678, 1112, 77 **ACC 25, 15, 200
2  2 C*BCCC         12, 13, 14, 1680   AC*        <NA>
3  3    B**               896, 45277   AAA         287
4  4    C*B           5554, 322, 142  C*A*  1, 2, 3, 4

您可以修改calculate函数来检查NA值。

library(data.table)
calculate <- function(p, q) {
mapply(function(x, y) {
if(any(is.na(x))) NA 
else toString(tapply(as.numeric(x), rleid(y), sum))
}, strsplit(p, ','), strsplit(q, ''))
}
df[dur_cols] <- Map(calculate, df[dur_cols], df[aoi_cols])
df
#  id  A_aoi                    A_dur B_aoi       B_dur
#1  1 C*BB*B 234, 312, 3678, 1112, 77 **ACC 25, 15, 200
#2  2 C*BCCC         12, 13, 14, 1680   AC*        <NA>
#3  3    B**               896, 45277   AAA         287
#4  4    C*B           5554, 322, 142  C*A*  1, 2, 3, 4

最新更新