关于使用R STUDIO过滤不同长度的数据

问题描述 投票:0回答:1

我有 1000 行和 800 列的数据集。我想过滤每列中的非零值,并准备一个每列中仅包含非零值的新数据集。问题是每列都有不同的长度和非零值的位置,这是通过简单应用过滤函数来获取值的障碍。我的输入数据集如下表所示。 |点1 |点2 |第3点| |:------:|:------:|:-----:| | -0.2 |0 | 0 | |0| 0.8|0| |0|0|2.8| |-0.5|0|0| |0|0|0| |0|0|-0.5| |0|1.8|0| |-0.25|0|0| |0|0|-0.63| |0.47|0|0| |0|2.8|0| |0|0|-0.58| |0|0|-0.58|

而且,我想要的输出是: |第1点|点2|第3点| |:----:|:-----:|:-----:| |-0.2|0.8|2.8| |-0.5|1.8|2.8| |-0.25|2.8|-0.63| |0.47||-0.58| |||-0.58|

我正在使用 R Studio 来处理这个问题:

 df1<- read.csv("D:/New folder/AnomalyY.csv")
 df1 <- setDT(df1)
 filfun <- function(data){
  rows <- apply(data, 1, function(x) all(x !=0))
  filtered_data <- data[rows,] 
   return(filtered_data)}

  filtered_data <- filfun(df1)
  print(filtered_data)

但是,该脚本仅适用于一列,不能同时适用于多列...... 如果有任何其他方法来完成此任务,任何方法或任何其他编程语言,请指导我。 我感谢这方面的任何帮助或指导 预先感谢

r dataframe filtering
1个回答
0
投票

如果您需要

data.frame
(或
data.table
),所有列必须具有相同的长度。因此,您必须将 0 替换为
NA
值。那么所有的操作(总和,平均值,...)将像不存在一样进行操作(只要您设置
na.rm = TRUE
)。然后,您还可以导出为 CSV 并将
NA
设置为空 (
write.csv(df2, "df2.csv", na = "")
.

library(data.table)

df1 <- tibble::tribble(
~ point1,   ~ point2, ~ point3,
-0.2,   0,  0,
0,  0.8,    0,
0,  0,  2.8,
-0.5,   0,  0,
0,  0,  0,
0,  0,  -0.5,
0,  1.8,    0,
-0.25,  0,  0,
0,  0,  -0.63,
0.47,   0,  0,
0,  2.8,    0,
0,  0,  -0.58,
0,  0,  -0.58,
)

df1 <- setDT(df1)

df1_mat <- df1 |> 
  as.matrix()

# Return a data.table (it must be rectangular)
df1_mat[df1_mat == 0] <- NA

df2 <- df1_mat |> 
  as.data.frame() |> 
  setDT()

df2
#>     point1 point2 point3
#>  1:  -0.20     NA     NA
#>  2:     NA    0.8     NA
#>  3:     NA     NA   2.80
#>  4:  -0.50     NA     NA
#>  5:     NA     NA     NA
#>  6:     NA     NA  -0.50
#>  7:     NA    1.8     NA
#>  8:  -0.25     NA     NA
#>  9:     NA     NA  -0.63
#> 10:   0.47     NA     NA
#> 11:     NA    2.8     NA
#> 12:     NA     NA  -0.58
#> 13:     NA     NA  -0.58

如果结果中确实需要不同的长度,可以使用

lapply
但它会返回向量列表:


lapply(df1, \(x) x[x != 0])
#> $point1
#> [1] -0.20 -0.50 -0.25  0.47
#> 
#> $point2
#> [1] 0.8 1.8 2.8
#> 
#> $point3
#> [1]  2.80 -0.50 -0.63 -0.58 -0.58

但是这不能转换回

data.frame
:

lapply(df1, \(x) x[x != 0]) |> as.data.frame()
#> Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : arguments imply differing number of rows: 4, 3, 5

创建于 2024-04-19,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.