3

所以它有一个 csv 我正在读入一个 R 数据帧,它看起来像这样

clientx,clienty,screenx,screeny
481,855,481,847
481,784,481,847
481,784,481,847
879,292,879,355

第一行当然是标题。所以我们有 4 列,其中包含数字数据,范围从 1 到 4 位。集合中没有负数,除了 -1 表示缺失值。我想删除任何 4 列中包含 -1 的每一行。

在此先感谢您的帮助

4

2 回答 2

9

您最有效的方法是使用 的na.strings参数将所有值read.csv()编码为,然后删除不完整的情况。-1NA


na.strings=-11 步:设置read.csv()

x <- read.csv(text="
clientx,clienty,screenx,screeny
481,855,481,847
481,784,481,847
481,784,481,847
-1,292,879,355", header=TRUE, na.strings=-1)

x
clientx clienty screenx screeny
1     481     855     481     847
2     481     784     481     847
3     481     784     481     847
4      NA     292     879     355

第 2 步:现在使用complete.casesor na.omit

x[complete.cases(x), ]
  clientx clienty screenx screeny
1     481     855     481     847
2     481     784     481     847
3     481     784     481     847

na.omit(x)
  clientx clienty screenx screeny
1     481     855     481     847
2     481     784     481     847
3     481     784     481     847

于 2012-11-19T13:25:20.160 回答
8

直接方式:

df <- df[!apply(df, 1, function(x) {any(x == -1)}),]

更新:如果 data.frame 包含字符列,则此方法将失败,因为apply隐式将 data.frame 转换为矩阵(仅包含一种类型的数据)并且字符类型优先于数字类型,因此 data.frame 将转换为字符矩阵。

或将 -1 替换为NA然后使用na.omit

df[df==-1] <- NA
df <- na.omit(df)

这些应该工作,我没有检查。请始终尝试提供可重现的示例来说明您的问题。

于 2012-11-19T13:15:01.747 回答