有多少人服用了4种感兴趣的药物?R
我有一长串接受药物治疗的人,他们的编码是ATC变量。我想知道有多少人服用过4种特殊药物。例如,我想统计一下有多少人使用过这种特殊模式的药物“C07ABC”和“C09XYZ”和“C08123”和“C03ZOO”。有些人可能不止一次使用某些药物(如C07或C08),没关系,我只想统计一下有多少人有我感兴趣的独特疗法。我不在乎他们服用了多少次这种独特的药物。但是,因为我有各种各样的模式需要查找,所以我想使用grepl函数。为了进一步解释这一点,我第一次尝试使用sum命令:有多少人服用了4种感兴趣的药物?R,r,unique,long-integer,R,Unique,Long Integer,我有一长串接受药物治疗的人,他们的编码是ATC变量。我想知道有多少人服用过4种特殊药物。例如,我想统计一下有多少人使用过这种特殊模式的药物“C07ABC”和“C09XYZ”和“C08123”和“C03ZOO”。有些人可能不止一次使用某些药物(如C07或C08),没关系,我只想统计一下有多少人有我感兴趣的独特疗法。我不在乎他们服用了多少次这种独特的药物。但是,因为我有各种各样的模式需要查找,所以我想使用grepl函数。为了进一步解释这一点,我第一次尝试使用sum命令: sum(df[grepl('
sum(df[grepl('^C07.*?'|'^C09.*?'|'^C08.*?|C03.*?', as.character(df$atc)),])
但是,这不起作用,因为我认为sum命令需要一个布尔函数。此外,我认为|符号在这里也不正确(我想要一个&),但我只是显示代码,以便您知道我在追求什么。也许ave函数是我所需要的-但我不确定我将如何编码它
提前谢谢
df
names fruit dates atc
4 john kiwi 2010-07-01 C07ABC
7 john apple 2010-09-01 C09XYZ
9 john banana 2010-11-01 C08123
13 john orange 2010-12-01 C03ZOO
14 john apple 2011-01-01 C07ABC
2 mary orange 2010-05-01 C09123
5 mary apple 2010-07-01 C03QRT
8 mary orange 2010-07-01 C09ZOO
10 mary apple 2010-09-01 C03123
12 mary apple 2010-11-01 C09123
1 tom apple 2010-02-01 C03897
3 tom banana 2010-03-01 C02CAMN
6 tom apple 2010-06-01 C07123
11 tom kiwi 2010-08-01 C02DA12
可以考虑避免使用正则表达式,而是从列<代码> ATC < /代码>中导出一些有意义的列。对于组合,您可能需要一个人员和药物的双向表,然后在矩阵上计算组合数
例如:tab <- xtabs(~ names + atc, df)
combo <- c("C07ABC", "C09XYZ", "C08123", "C03ZOO")
haveCombo <- rowSums(tab[,combo] > 0) == length(combo)
sum(haveCombo)
tab你可以试试这个
drugs <- c("C07ABC","C09XYZ", "C08123", "C03ZOO")
table(unique(df[df$atc %in% drugs, c("names", "atc")])$names)
# john mary tom
# 4 0 0
names(which(table(unique(df[df$atc %in% drugs, c("names", "atc")])$names) > 3))
# [1] "john"
3)
#[1]“约翰”
数据
df <- structure(list(names = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("john", "mary", "tom"
), class = "factor"), fruit = structure(c(3L, 1L, 2L, 4L, 1L,
4L, 1L, 4L, 1L, 1L, 1L, 2L, 1L, 3L), .Label = c("apple", "banana",
"kiwi", "orange"), class = "factor"), dates = structure(c(5L,
7L, 8L, 9L, 10L, 3L, 5L, 5L, 7L, 8L, 1L, 2L, 4L, 6L), .Label = c("2010-02-01",
"2010-03-01", "2010-05-01", "2010-06-01", "2010-07-01", "2010-08-01",
"2010-09-01", "2010-11-01", "2010-12-01", "2011-01-01"), class = "factor"),
atc = structure(c(8L, 11L, 9L, 6L, 8L, 10L, 5L, 12L, 3L,
10L, 4L, 1L, 7L, 2L), .Label = c("C02CAMN", "C02DA12", "C03123",
"C03897", "C03QRT", "C03ZOO", "C07123", "C07ABC", "C08123",
"C09123", "C09XYZ", "C09ZOO"), class = "factor")), .Names = c("names",
"fruit", "dates", "atc"), class = "data.frame", row.names = c("4",
"7", "9", "13", "14", "2", "5", "8", "10", "12", "1", "3", "6",
"11"))
df除了不需要将整个数据帧行传递到sum
之外,您在该模式中还有额外的引号:
> sum( grepl('^C07.*|^C09.*|^C08.*|C03.*', df$atc) )
[1] 12
我认为这更容易阅读:
> sum( grepl('^(C07|C09|C08|C03).*', df$atc) )
[1] 12
但现在我了解到,您希望使用所有这些,并在患者id内进行计算。这可能需要使用&作为连接器,但我决定尝试不同的路径并使用unique
,然后在聚合操作中计算唯一匹配的数量
> aggregate(atc ~ names, data=df,
function(drgs) length(unique(grep('^(C07|C09|C08|C03)', drgs))))
names atc
1 john 5
2 mary 5
3 tom 2
虽然这是匹配项的数量,但不是唯一项的数量,因为我忘记在grep
调用中输入value=TRUE(还需要使用substr
以避免单独计算具有不同尾随ATC代码的同类项):
这有点类似于@MichaelLawrence的矩阵/表格方法,但我认为它可以更好地扩展,因为创建的“表格”会小得多:
combo <- c("C07", "C09", "C08", "C03")
tapply(df$atc, df$names, function(drgs) sum(combo %in% substr(drgs,1,3)) )
#------
john mary tom
4 2 2
combo这只是@Michael Lawrence答案的延续。我将药物改为@user2363642想要的,并且我还将atc列的子字符串改为只使用前三个字符,我相信这也是@user2363642想要的。另外,对于行和,我首先将所有非零数量改为1,以确保我们不会重复计算药物
drugs <- c("C07", "C09", "C08", "C03")
df$atc.abbr <- substring(df$atc, 1, 3)
xt <- xtabs(~ names + atc.abbr, df)
xt[xt>0] <- 1
rowSums(xt[,drugs]) >= length(drugs)
它不起作用,因为你应该把grepl传递给sum
。我只是把^in放在habitGreat之外-谢谢你。这绝对是我可以使用的,尽管可能有点乏味,因为我想要grepl的原因是伞代码c07(或C08或c09)实际上包含了我也需要搜索的多个子代码。换句话说,我需要搜索所有以C08(或C07或其他)开头的药物。我希望grepl是一种有效的方法。尽管如此,你的答案仍然非常方便,我想我可以把所有的代码都打出来!谢谢。我对答案进行了编辑,以一种比regexps更正式的方式展示了如何对其进行概括。我只是想建议进行编辑,您可能还需要将combo
更新为combo Briliant!太好了!我实际上不知道子字符串的代码。我熟悉excel,但很高兴能在R中使用。谢谢@Michael,这可能是你用xtabs创建的一个相当大的矩阵。维度将是唯一(名称)乘以唯一(atc)。我可能担心它不能很好地扩展。这实际上会产生误导性的结果,因为在数据框上调用unique
不是你想要的,因为例如水果会妨碍你。甚至“^C0[3789]”
这很好-谢谢SF或代码。不过,我不明白[7983]这一点。它在干什么?为什么本提出了不同的数字?不同的。。。比什么好?“[7983]”是一个字符类,它将匹配方括号内的任何一项。它将匹配字符串开头的CO
,以及其后的3789
中的任何数字。哦,我现在明白你问题的重点了。。。。由于您要匹配这些项目中的任何一个,因此它们的输入顺序无关紧要。四位数字的任何排列在字符类中都是等效的。我的答案中的>0
避免了重复计数。
combo <- c("C07", "C09", "C08", "C03")
tapply(df$atc, df$names, function(drgs) sum(combo %in% substr(drgs,1,3)) )
#------
john mary tom
4 2 2
drugs <- c("C07", "C09", "C08", "C03")
df$atc.abbr <- substring(df$atc, 1, 3)
xt <- xtabs(~ names + atc.abbr, df)
xt[xt>0] <- 1
rowSums(xt[,drugs]) >= length(drugs)
john mary tom
TRUE FALSE FALSE