Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有多少人服用了4种感兴趣的药物?R_R_Unique_Long Integer - Fatal编程技术网

有多少人服用了4种感兴趣的药物?R

有多少人服用了4种感兴趣的药物?R,r,unique,long-integer,R,Unique,Long Integer,我有一长串接受药物治疗的人,他们的编码是ATC变量。我想知道有多少人服用过4种特殊药物。例如,我想统计一下有多少人使用过这种特殊模式的药物“C07ABC”和“C09XYZ”和“C08123”和“C03ZOO”。有些人可能不止一次使用某些药物(如C07或C08),没关系,我只想统计一下有多少人有我感兴趣的独特疗法。我不在乎他们服用了多少次这种独特的药物。但是,因为我有各种各样的模式需要查找,所以我想使用grepl函数。为了进一步解释这一点,我第一次尝试使用sum命令: sum(df[grepl('

我有一长串接受药物治疗的人,他们的编码是ATC变量。我想知道有多少人服用过4种特殊药物。例如,我想统计一下有多少人使用过这种特殊模式的药物“C07ABC”和“C09XYZ”和“C08123”和“C03ZOO”。有些人可能不止一次使用某些药物(如C07或C08),没关系,我只想统计一下有多少人有我感兴趣的独特疗法。我不在乎他们服用了多少次这种独特的药物。但是,因为我有各种各样的模式需要查找,所以我想使用grepl函数。为了进一步解释这一点,我第一次尝试使用sum命令:

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