在以下示例中:
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)
错误的根源是什么?
我猜测我们可能在原始数据集中重复了一些列名。例如,如果我们将第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)
| 归档时间: |
|
| 查看次数: |
460 次 |
| 最近记录: |