以下是我使用的一些策略。我相信 .ROW 功能可能会出现。以下这些方法都不是快速的。这些是一些超出子集或过滤的策略。我试着像 dba 一样思考只是试图清理数据。如上所述,您可以选择或删除 data.table 中的行:
data(iris)
iris <- data.table(iris)
iris[3] # Select row three
iris[-3] # Remove row three
You can also use .SD to select or remove rows:
iris[,.SD[3]] # Select row three
iris[,.SD[3:6],by=,.(Species)] # Select row 3 - 6 for each Species
iris[,.SD[-3]] # Remove row three
iris[,.SD[-3:-6],by=,.(Species)] # Remove row 3 - 6 for each Species
注意:.SD 创建原始数据的子集,并允许您在 j 或后续 data.table 中做大量工作。请参阅https://stackoverflow.com/a/47406952/305675。在这里,我按萼片长度订购了我的虹膜,以指定的 Sepal.Length 为最小值,选择所有物种的前三个(按萼片长度)并返回所有随附数据:
iris[order(-Sepal.Length)][Sepal.Length > 3,.SD[1:3],by=,.(Species)]
删除行时,上述所有方法都会按顺序对 data.table 进行重新排序。您可以转置 data.table 并删除或替换现在是转置列的旧行。当使用 ':=NULL' 删除转置的行时,随后的列名也将被删除:
m_iris <- data.table(t(iris))[,V3:=NULL] # V3 column removed
d_iris <- data.table(t(iris))[,V3:=V2] # V3 column replaced with V2
当您将 data.frame 转回 data.table 时,您可能希望从原始 data.table 重命名并在删除的情况下恢复类属性。将 ":=NULL" 应用于现在转置的 data.table 会创建所有字符类。
m_iris <- data.table(t(d_iris));
setnames(d_iris,names(iris))
d_iris <- data.table(t(m_iris));
setnames(m_iris,names(iris))
您可能只想删除可以使用或不使用 Key 的重复行:
d_iris[,Key:=paste0(Sepal.Length,Sepal.Width,Petal.Length,Petal.Width,Species)]
d_iris[!duplicated(Key),]
d_iris[!duplicated(paste0(Sepal.Length,Sepal.Width,Petal.Length,Petal.Width,Species)),]
也可以使用“.I”添加增量计数器。然后,您可以搜索重复的键或字段,并通过使用计数器删除记录来删除它们。这在计算上很昂贵,但有一些优点,因为您可以打印要删除的行。
d_iris[,I:=.I,] # add a counter field
d_iris[,Key:=paste0(Sepal.Length,Sepal.Width,Petal.Length,Petal.Width,Species)]
for(i in d_iris[duplicated(Key),I]) {print(i)} # See lines with duplicated Key or Field
for(i in d_iris[duplicated(Key),I]) {d_iris <- d_iris[!I == i,]} # Remove lines with duplicated Key or any particular field.
您也可以只用 0 或 NA 填充一行,然后使用 i 查询删除它们:
X
x v foo
1: c 8 4
2: b 7 2
X[1] <- c(0)
X
x v foo
1: 0 0 0
2: b 7 2
X[2] <- c(NA)
X
x v foo
1: 0 0 0
2: NA NA NA
X <- X[x != 0,]
X <- X[!is.na(x),]