使用对具有缺失数据的数据帧的行应用&按行改变功能 - r

时间:2014-07-07 14:38:22

标签: r function dataframe apply

这是一个名为newdf的示例数据框。 AA,AB,AC等是rownames:

      value    c1    c2    c3    c4
AA    0.875 0.750 0.750 0.625 1.000
AB    1.000 1.000 0.812 0.562 0.375
AC    0.625 0.812 0.667 0.812 0.750
AD    0.375 0.625 0.938    NA 0.875
AE       NA 0.500 0.542 0.938 0.500
BA    1.000 0.958 0.875 0.875 1.000
BB    0.875 0.938 0.812 1.000 0.562
BC    0.750 0.708 0.750    NA 0.500
BD    0.500 0.333 0.750    NA 0.625
BE       NA 0.208 0.500    NA 0.250
CA       NA 0.938 1.000 0.562    NA
CB       NA    NA    NA 0.938 0.812
CC    1.000 1.000 0.750 1.000 1.000
CD    0.938 0.812    NA    NA    NA
CE       NA 0.688 0.875    NA 0.938
DA       NA    NA 0.625 1.000    NA
DB       NA    NA 1.000 0.375 0.625
DC       NA    NA 0.750 0.625 1.000
DD       NA    NA    NA    NA    NA
DE       NA 1.000 0.500 0.750 0.750
EA    1.000    NA    NA 0.375    NA
EB    0.875    NA    NA 0.750 1.000
EC    0.250    NA 1.000 1.000    NA
ED    0.000    NA    NA    NA    NA
EE       NA    NA    NA    NA    NA

我希望在行上使用apply。如果我的函数参数一致,我知道如何做到这一点非常简单。

例如,我想知道c1,c2,c3,c4有多少次> 0.9,我会按行执行此操作:

z<-newdf[-1]
apply(z, 1, function(x)  sum(x >= 0.9, na.rm=T)) #how many columns are >= 0.9

#AA AB AC AD AE BA BB BC BD BE CA CB CC CD CE DA DB DC DD DE EA EB EC ED EE 
# 1  1  0  1  1  2  2  0  0  0  2  1  3  0  1  1  1  1  0  1  0  1  2  0  0 

但是,我真正想知道的是,c1以后的列数大于newdf的第一个变量/列中存储的值。我试过这个,它返回垃圾:

value<-newdf[,1]
apply(z, 1, function(x)  sum(x >= value, na.rm=T)) #how many columns are >= value

我尝试将额外的参数传递给函数,类似于应用帮助页面但是没有正确使用它。

示例数据:

 newdf<-structure(list(value = structure(c(0.875, 1, 0.625, 0.375, NA, 
 1, 0.875, 0.75, 0.5, NA, NA, NA, 1, 0.938, NA, NA, NA, NA, NA, 
 NA, 1, 0.875, 0.25, 0, NA), .Dim = 25L, .Dimnames = list(c("AA", 
 "AB", "AC", "AD", NA, "BA", "BB", "BC", "BD", NA, NA, NA, "CC", 
 "CD", NA, NA, NA, NA, NA, NA, "EA", "EB", "EC", "ED", NA))), 
     c1 = structure(c(0.75, 1, 0.812, 0.625, 0.5, 0.958, 0.938, 
     0.708, 0.333, 0.208, 0.938, NA, 1, 0.812, 0.688, NA, NA, 
     NA, NA, 1, NA, NA, NA, NA, NA), .Dim = 25L, .Dimnames = list(
         c("AA", "AB", "AC", "AD", "AE", "BA", "BB", "BC", "BD", 
         "BE", "CA", NA, "CC", "CD", "CE", NA, NA, NA, NA, "DE", 
         NA, NA, NA, NA, NA))), c2 = structure(c(0.75, 0.812, 
     0.667, 0.938, 0.542, 0.875, 0.812, 0.75, 0.75, 0.5, 1, NA, 
     0.75, NA, 0.875, 0.625, 1, 0.75, NA, 0.5, NA, NA, 1, NA, 
     NA), .Dim = 25L, .Dimnames = list(c("AA", "AB", "AC", "AD", 
     "AE", "BA", "BB", "BC", "BD", "BE", "CA", NA, "CC", NA, "CE", 
     "DA", "DB", "DC", NA, "DE", NA, NA, "EC", NA, NA))), c3 = structure(c(0.625, 
     0.562, 0.812, NA, 0.938, 0.875, 1, NA, NA, NA, 0.562, 0.938, 
     1, NA, NA, 1, 0.375, 0.625, NA, 0.75, 0.375, 0.75, 1, NA, 
NA), .Dim = 25L, .Dimnames = list(c("AA", "AB", "AC", NA, 
"AE", "BA", "BB", NA, NA, NA, "CA", "CB", "CC", NA, NA, "DA", 
"DB", "DC", NA, "DE", "EA", "EB", "EC", NA, NA))), c4 = structure(c(1, 
0.375, 0.75, 0.875, 0.5, 1, 0.562, 0.5, 0.625, 0.25, NA, 
0.812, 1, NA, 0.938, NA, 0.625, 1, NA, 0.75, NA, 1, NA, NA, 
NA), .Dim = 25L, .Dimnames = list(c("AA", "AB", "AC", "AD", 
"AE", "BA", "BB", "BC", "BD", "BE", NA, "CB", "CC", NA, "CE", 
NA, "DB", "DC", NA, "DE", NA, "EB", NA, NA, NA)))), .Names = c("value", 
"c1", "c2", "c3", "c4"), class = "data.frame", row.names = c("AA", 
"AB", "AC", "AD", "AE", "BA", "BB", "BC", "BD", "BE", "CA", "CB", 
"CC", "CD", "CE", "DA", "DB", "DC", "DD", "DE", "EA", "EB", "EC", 
"ED", "EE"))

2 个答案:

答案 0 :(得分:1)

使用像

这样的东西会更有效率
apply

虽然此处rowSums(newdf[,-1]>=newdf[, 1], na.rm=T) 会将na.rm=T的行变为0.要将这些行返回value==NULL,您可以

NA

获取

rr<-rowSums(newdf[,-1]>=newdf[, 1], na.rm=T)
is.na(rr)<-is.na(newdf[,1])
rr

答案 1 :(得分:0)

当您在功能中使用申请时,&#39; x&#39;是行中元素的列表,所以,

> newdf
   value    c1    c2    c3    c4
AA 0.875 0.750 0.750 0.625 1.000
AB 1.000 1.000 0.812 0.562 0.375
AC 0.625 0.812 0.667 0.812 0.750
AD 0.375 0.625 0.938    NA 0.875
AE    NA 0.500 0.542 0.938 0.500
BA 1.000 0.958 0.875 0.875 1.000
BB 0.875 0.938 0.812 1.000 0.562
BC 0.750 0.708 0.750    NA 0.500
BD 0.500 0.333 0.750    NA 0.625
BE    NA 0.208 0.500    NA 0.250
CA    NA 0.938 1.000 0.562    NA
CB    NA    NA    NA 0.938 0.812
CC 1.000 1.000 0.750 1.000 1.000
CD 0.938 0.812    NA    NA    NA
CE    NA 0.688 0.875    NA 0.938
DA    NA    NA 0.625 1.000    NA
DB    NA    NA 1.000 0.375 0.625
DC    NA    NA 0.750 0.625 1.000
DD    NA    NA    NA    NA    NA
DE    NA 1.000 0.500 0.750 0.750
EA 1.000    NA    NA 0.375    NA
EB 0.875    NA    NA 0.750 1.000
EC 0.250    NA 1.000 1.000    NA
ED 0.000    NA    NA    NA    NA
EE    NA    NA    NA    NA    NA

> apply(newdf,1,function(x) sum(x[-1] >= x[1],na.rm=T)) # the -1 removes the first element from the sum, and the x[1] is the value of the first element in the row
AA AB AC AD AE BA BB BC BD BE CA CB CC CD CE DA DB DC DD DE EA EB EC ED EE 
 1  1  4  3  0  1  2  1  2  0  0  0  3  0  0  0  0  0  0  0  0  1  2  0