根据另一个变量中相关值的位置汇总一个变量中字符串中的值
Summarize values in strings in one variable based on positions of related values in another variable
我有这样的数据:
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_dur
和 B_dur
列中总结那些在字符串中具有与 运行 相同 position 的值] 长度在 A_aoi
和 B_aoi
.
列中重复
现在'positons'可以被索引捕获,这就是为什么我首先拆分所有列中的字符串:
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_aoi
和 B_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_aoi
和 index_B_aoi
中的索引与 sapply
汇总 A_dur
和 B_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
一个。
这是一个借助 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
创建值和 [ 连续出现的组=16=] 他们。我们对数据集中的所有此类对应用 calculate
函数。
我有这样的数据:
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_dur
和 B_dur
列中总结那些在字符串中具有与 运行 相同 position 的值] 长度在 A_aoi
和 B_aoi
.
现在'positons'可以被索引捕获,这就是为什么我首先拆分所有列中的字符串:
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_aoi
和 B_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_aoi
和 index_B_aoi
中的索引与 sapply
汇总 A_dur
和 B_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
一个。
这是一个借助 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
创建值和 [ 连续出现的组=16=] 他们。我们对数据集中的所有此类对应用 calculate
函数。