R 行的唯一值

R 行的唯一值,r,experimental-design,R,Experimental Design,我经常遇到如下数据: #create dummy data frame data <- as.data.frame(diag(4)) data[data==0] <- NA data[2,2] <- NA data #V1 V2 V3 V4 #1 1 NA NA NA #2 NA NA NA NA #3 NA NA 1 NA #4 NA NA NA 1 我写了以下内容,但想知道是否有更有效的方法(即使用更少的代码行) #用条件编号替换条目 cond我们可以将max.c

我经常遇到如下数据:

#create dummy data frame
data <- as.data.frame(diag(4))
data[data==0] <- NA
data[2,2] <- NA
data

#V1 V2 V3 V4
#1  1 NA NA NA
#2 NA NA NA NA
#3 NA NA  1 NA
#4 NA NA NA  1
我写了以下内容,但想知道是否有更有效的方法(即使用更少的代码行)

#用条件编号替换条目

cond我们可以将
max.col
ties.method='first'
一起用于“data”中非NA元素的逻辑矩阵。为了使只有NA元素的行成为NA,我们将逻辑矩阵的
max.col
索引与
rowsumes
相乘,将0个非NA行转换为NA(
NA^

或者另一个选项是
pmax
。我们将列索引与数据相乘,以便非NA元素被索引替换。然后,使用
pmax
na.rm=TRUE
并获得每行的最大值

 do.call(pmax, c(col(data)*data, na.rm=TRUE))
 #[1]  1 NA  3  4

我们可以将
max.col
ties.method='first'
一起用于“data”中非NA元素的逻辑矩阵。为了使只有NA元素的行成为NA,我们将逻辑矩阵的
max.col
索引与
rowsumes
相乘,将0个非NA行转换为NA(
NA^

或者另一个选项是
pmax
。我们将列索引与数据相乘,以便非NA元素被索引替换。然后,使用
pmax
na.rm=TRUE
并获得每行的最大值

 do.call(pmax, c(col(data)*data, na.rm=TRUE))
 #[1]  1 NA  3  4

使用
重塑2
软件包:

> data$ID <- rownames(data)
> melt(data, 'ID', na.rm=TRUE)
   ID variable value
1   1       V1     1
11  3       V3     1
16  4       V4     1
>数据$ID(数据'ID',na.rm=TRUE)
ID变量值
1 1 v11
11 3 v31
16 4 V4 1
IMHO,这有一个优点,即保持ID随治疗因子变化;此外,如果您有响应度量,它也会出现在值列中

编辑:

如果在任何情况下都不想包含主题,可以显式地重构该指示符变量:

data$VNA <- ifelse(apply(is.na(data), 1, all), 1, NA)

data$VNA使用
reformae2
包:

> data$ID <- rownames(data)
> melt(data, 'ID', na.rm=TRUE)
   ID variable value
1   1       V1     1
11  3       V3     1
16  4       V4     1
>数据$ID(数据'ID',na.rm=TRUE)
ID变量值
1 1 v11
11 3 v31
16 4 V4 1
IMHO,这有一个优点,即保持ID随治疗因子变化;此外,如果您有响应度量,它也会出现在值列中

编辑:

如果在任何情况下都不想包含主题,可以显式地重构该指示符变量:

data$VNA <- ifelse(apply(is.na(data), 1, all), 1, NA)

data$VNA不如其他解决方案聪明和高效,但可能更具可读性

apply(data,
      MARGIN = 1, 
      FUN = function(x) { 
          if(all(is.na(x))) return(NA)
          return(which(!is.na(x)))
      }
)
# [1]  1 NA  3  4

与其他解决方案相比,它不那么聪明和高效,但可能更具可读性

apply(data,
      MARGIN = 1, 
      FUN = function(x) { 
          if(all(is.na(x))) return(NA)
          return(which(!is.na(x)))
      }
)
# [1]  1 NA  3  4