按索引替换行

Dav*_*vid 3 r data.table

在以下示例中:

library(data.table)
df1 <- data.table("1A"=c(0,0,0,0),"1B"=c(4:3),"2A"=c(0,0,0,0), "2B"=c(4:3))
df2 <- data.table("1A"=c(0,0),"1B"=c(1:2),"2A"=c(0,0), "2B"=c(1:2))

df1
#    1A 1B 2A 2B
# 1:  0  4  0  4
# 2:  0  3  0  3
# 3:  0  4  0  4
# 4:  0  3  0  3

df2
#    1A 1B 2A 2B
# 1:  0  1  0  1
# 2:  0  2  0  2

indx = c(1,3)
indx
# [1] 1 3

df1[indx,] <- df2
df1
#    1A 1B 2A 2B
# 1:  0  1  0  1
# 2:  0  3  0  3
# 3:  0  2  0  2
# 4:  0  3  0  3
Run Code Online (Sandbox Code Playgroud)

我成功地将df1中的第1行和第3行替换为df2。在真实数据中复制相同的练习,遇到错误:

无法在同一查询中两次分配给同一列(检测到重复项)。

在此表达式中:

Z4[positionpdis,] <- ZpdisRow2
Run Code Online (Sandbox Code Playgroud)

这些对象具有以下属性:

is.data.table(ZpdisRow2)
# [1] TRUE
is.data.table(Z4)
# [1] TRUE
dim(Z4)
# [1] 7968 7968
dim(Z4[positionpdis,])
# [1]   48 7968
dim(ZpdisRow2)
# [1]   48 7968
str(positionpdis)
# int [1:48] 91 257 423 589 755 921 1087 1253 1419 1585 ...
> length(unique(positionpdis))
# [1] 48
Run Code Online (Sandbox Code Playgroud)

错误的根源是什么?

akr*_*run 5

我猜测我们可能在原始数据集中重复了一些列名。例如,如果我们将第3列名称更改为第一个列名称,则会出现错误。

colnames(df1)[3] <- '1A'
df1[indx,] <- df2
Run Code Online (Sandbox Code Playgroud)

在错误[<-.data.table(*tmp*,INDX,值=列表(1A= C(0,0),:不能在同一查询分配给相同的列两次(重复检测的)。

我们可以使列名唯一,make.unique这对于这种情况是一种方便的功能,而不必查看每个列名是否重复。

 colnames(df1) <- make.unique(colnames(df1)) 
 df1[indx,] <- df2
 df1
 #  1A 1B 1A.1 2B
 #1:  0  1    0  1
 #2:  0  3    0  3
 #3:  0  2    0  2
 #4:  0  3    0  3
Run Code Online (Sandbox Code Playgroud)

也应适用于重复的列名的另一个选项是set。由于[.data.table避免了开销,因此非常高效。在这里,我们遍历列索引(seq_along(df1)),并基于行(i)和列(j)索引,set将'df1'中的值与'df2'的值进行比较。

 for(j in seq_along(df1)){
           set(df1, i= as.integer(indx), j=j, df2[[j]])
  }
 df1
#   1A 1B 1A 2B
#1:  0  1  0  1
#2:  0  3  0  3
#3:  0  2  0  2
#4:  0  3  0  3
Run Code Online (Sandbox Code Playgroud)