我有这样的数据:
id diag1 diag2 diag3 diag4 diag5 diag5 diag 6 diag7 diag8 diag9
26 V3000 75261 V053 V290
23 V3001 75261 V053
24 V3000 75537 75567 V053
19 V3001 7503 7613 7746 7631 7560 V290 76529 V1819
29 V3001 77989 7470 7852 V053
31 V3000 75261 79415 77989 V053
33 V3000 7700 75329 7705 7750 7706 77089 7746 7661 75251
20 V3000 7530 7795 76529 V053 V183
17 V3000 75329 7788 V053
22 4659 7862 7455 V7285
21 V3000 7503 77181 7579 7560 75251
30 V3000 7470 V053
27 V3000 76519 7470 7726 7746 76719 76528 V053 V502
我想添加var d1-d40,其值基于:
如果从diag1到diag9有'75261'那么d1 = 1否则d1 = 0
如果从diag1到diag9有'7700'那么d2 = 1否则d2 = 0
如果从diag1到diag9有'7613''75329'那么d3 = 1否则d3 = 0
如果从diag1到diag9有'7470','7746'则d4 = 1 e; se d4 = 0 等
我使用了这样的代码
bd$d40 = 0
for (i in ncol(bd){
if (bd[,i] %in% ('75261')) {bd[,'d40'] = 1}
}
但他们没有工作。 感谢。
答案 0 :(得分:1)
听起来我正在尝试确定给定的行是否包含特定的id。您可以使用apply()函数执行此操作:
d1 <- apply(bd, 1, function(x) as.numeric("75261" %in% x))
d2 <- apply(bd, 1, function(x) as.numeric("7700" %in% x))
...
答案 1 :(得分:0)
当我意识到SAS表达式都有一个隐含的for循环(在当前数据集中只能在当前数据集中)执行时,我仍然记得那个时刻。可以构建具有相同功能的R代码,但需要明确的行范围才能使矢量化正常工作,以及在工作空间中的所有项目中正确分配给特定目标集。
这可能会让你的一个for循环正常工作:
bd$d40 = 0
for (i in 2:10 ) {
bd$d40 <- ifelse ( bd[,i] %in% '75261', 1, bd$d40)
}
您真的不想说for(i in ncol(bd) )
,因为列数正在增加。而且您确实需要使用面向列的函数ifelse
而不是if
。 R中的“If”实际上是两种不同的构造,而在SAS和SPSS中,它是一种面向列的构造,R模拟为ifelse
而不是if
。另请注意,我没有使用1
覆盖之前的ifelse
- 值(除了我的第一个帖子之外)。
R还鼓励您编写对数据对象进行操作的函数。在您的情况下,您希望将测试应用于列块并获得面向行的答案,以便您可以使用R函数pmax
的模拟封装该操作,该函数返回面向列的最大值(尽管读取我再次猜测你也可以说它是面向行的,无论如何它对于列的块是好的,因为它按行进行计算。):
pany <- function(df, items)) { # edited to allow match for > 1 item
apply(df, 1, function(row) length(intersect( row , items)) >= 1 )}
pany(bd[,2:10], '75261')
[1] TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
[12] FALSE FALSE
bd$d40 <- as.numeric(pany(bd[,2:10], '75261'))
bd$d40
[1] 1 1 0 0 0 1 0 0 0 0 0 0 0