如何筛选或子集每行R中的数据

如何筛选或子集每行R中的数据,r,dataframe,filter,row,subset,R,Dataframe,Filter,Row,Subset,我对R还比较陌生,仍然在研究如何从数据帧中过滤数据。我有一个由406行48列组成的数据框,其中有些数据缺失: set.seed(123) mydata <- data.frame(matrix(rnorm(406*48), nrow = 406, ncol = 48)) diag(mydata) <- NA mydata[10:20,25:40] <- NA set.seed(123) mydata编辑:替代解决方案(一行) 或者(根据您的评论),您可以使用以下方法在一行中

我对R还比较陌生,仍然在研究如何从数据帧中过滤数据。我有一个由406行48列组成的数据框,其中有些数据缺失:

set.seed(123)
mydata <- data.frame(matrix(rnorm(406*48), nrow = 406, ncol = 48))
diag(mydata) <- NA
mydata[10:20,25:40] <- NA

set.seed(123)

mydata编辑:替代解决方案(一行)

或者(根据您的评论),您可以使用以下方法在一行中将正值替换为NA:

mydata=apply(mydata,2,函数(x){x=ifelse(x为.numeric(mydata[1,]))
[1] NA-0.34975424-0.07767320-1.16193756-0.33768064-1.09321744 0.66392711 0.27303842-2.23650827
[10] -0.42412913  1.44870575  0.03134468  0.19868021  0.17935206  1.51321052 -0.33100059  0.26331289 -0.20527804
[19] -0.22355074 -0.96041834 -0.82061841  0.67362771 -1.11751900 -0.58768884 -1.14399798  0.11782292 -1.51231253
[28] -1.93607886 -0.33478355  0.70214667  0.51443110 -1.04816477 -1.20696026 -0.97035477 -0.40159316  0.80351157
[37]  1.07208956  0.08778464  0.40148417  1.27912058 -0.90539292 -2.57307640 -0.38050016 -0.51386913  0.39852024
[46]  0.68074424 -0.04131547 -1.58519483
及之后:

>as.numeric(mydata[1,])
[1] NA-0.34975424-0.07767320-1.16193756-0.33768064-1.09321744 NA-2.23650827
[10] -0.42412913 NA NA-0.33100059 NA-0.20527804
[19] -0.22355074-0.96041834-0.82061841 NA-1.11751900-0.58768884-1.143997998 NA-1.51231253
[28]-1.93607886-0.33478355 NA-1.04816477-1.20696026-0.97035477-0.40159316 NA
[37]NA NA-0.90539292-2.57307640-0.38050016-0.51386913 NA
[46]NA-0.04131547-1.58519483
以前的解决方案

这里有另一个解决方案,可能不是最好的,但看起来应该没问题。 使用您描述的数据帧:

set.seed(123)

mydata如果您的目标是简单地将正值替换为NA
,则可以 非常简单地利用R的矢量化

首先,让我制作一个较小的示例数据集,以便我们可以查看所有内容:

set.seed(1)
nrow <- 6
ncol <- 4
mydata <- data.frame(matrix(rnorm(nrow * ncol), nrow = nrow, ncol = ncol))
diag(mydata) <- NA
mydata[4:5, 1:2] <- NA
mydata

##           X1        X2          X3          X4
## 1         NA 0.4874291 -0.62124058  0.82122120
## 2  0.1836433        NA -2.21469989  0.59390132
## 3 -0.8356286 0.5757814          NA  0.91897737
## 4         NA        NA -0.04493361          NA
## 5         NA        NA -0.01619026  0.07456498
## 6 -0.8204684 0.3898432  0.94383621 -1.98935170
但是从OP来看,你想要的似乎是一个列表在哪里 每个元素可以有不同的长度(注意:每个元素都有一个
data.frame
行必须有相同数量的条目;但是列表允许每个条目 元素以具有任意数量的条目)

例如,要制作这样的列表,您可以尝试以下方法:

mylist <- lapply(1:nrow(mydata), function(i) {
    x <- mydata[i, ]
    x[x <= 0 & !is.na(x)]
})
mylist

## [[1]]
## [1] -0.6212406
## 
## [[2]]
## [1] -2.2147
## 
## [[3]]
## [1] -0.8356286
## 
## [[4]]
## [1] -0.04493361
## 
## [[5]]
## [1] -0.01619026
## 
## [[6]]
## [1] -0.8204684 -1.9893517

mylist,以便在您要删除数据的地方列出(即值>0),你想要什么?
NA
?我只想删除这些值。但是矩阵的布局会是什么样子?你可能会让一行保留10个值,一行保留8个值-剩下的2个空间中会是什么?维度需要一致,除非除了矩阵或dat之外,你还考虑其他结构一个框架然后在值>0的情况下,我也希望有
NA
@Friederike,在我下面的回答中,我提供两种方法来消除正值,并用
NA
替换它。很好!我觉得很愚蠢,没有考虑
mydata[mydata>0]
mydata[mydata > 0] <- NA
mydata

##           X1 X2          X3        X4
## 1         NA NA -0.62124058        NA
## 2         NA NA -2.21469989        NA
## 3 -0.8356286 NA          NA        NA
## 4         NA NA -0.04493361        NA
## 5         NA NA -0.01619026        NA
## 6 -0.8204684 NA          NA -1.989352
mylist <- lapply(1:nrow(mydata), function(i) {
    x <- mydata[i, ]
    x[x <= 0 & !is.na(x)]
})
mylist

## [[1]]
## [1] -0.6212406
## 
## [[2]]
## [1] -2.2147
## 
## [[3]]
## [1] -0.8356286
## 
## [[4]]
## [1] -0.04493361
## 
## [[5]]
## [1] -0.01619026
## 
## [[6]]
## [1] -0.8204684 -1.9893517