如何筛选或子集每行R中的数据
我对R还比较陌生,仍然在研究如何从数据帧中过滤数据。我有一个由406行48列组成的数据框,其中有些数据缺失:如何筛选或子集每行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编辑:替代解决方案(一行) 或者(根据您的评论),您可以使用以下方法在一行中
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