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