如果我創建一個資料框
df = data.frame(a=c(1,2,3), b=c(4,5,6))
為什么這段代碼
df$z[c(1,2)] = c(7,8)
產生這個錯誤
Error in `$<-.data.frame`(`*tmp*`, z, value = c(7, 8)) :
replacement has 2 rows, data has 3
雖然這段代碼有效?
df$z[c(2,3)] = c(7,8)
df
a b z
1 1 4 NA
2 2 5 7
3 3 6 8
uj5u.com熱心網友回復:
錯誤來自$<-.data.frame
函式
> `$<-.data.frame`
function (x, name, value)
{
cl <- oldClass(x)
class(x) <- NULL
nrows <- .row_names_info(x, 2L)
if (!is.null(value)) {
N <- NROW(value)
if (N > nrows)
stop(sprintf(ngettext(N, "replacement has %d row, data has %d",
"replacement has %d rows, data has %d"), N, nrows),
domain = NA)
...
即N > nrows
滿足條件
> NROW(c(7, 8))
[1] 2
> .row_names_info(df, 2L)
[1] 3
由traceback()
錯誤確認
> traceback()
3: stop(sprintf(ngettext(N, "replacement has %d row, data has %d",
"replacement has %d rows, data has %d"), N, nrows), domain = NA)
2: `$<-.data.frame`(`*tmp*`, z, value = c(7, 8))
1: `$<-`(`*tmp*`, z, value = c(7, 8))
uj5u.com熱心網友回復:
如果賦值是一個向量,則 R 似乎創建了z
要添加到 的向量data.frame
,并且該向量需要與 中的行數具有相同的長度data.frame
。
如果您list
改為使用物件,則會更清楚發生了什么:
df <- list(a = 1:3, b = 4:6)
df$z1[1:2] <- 7:8
df$z2[2:3] <- 7:8
df$z3[c(1,3)] <- 7:8
df
#> $a
#> [1] 1 2 3
#>
#> $b
#> [1] 4 5 6
#>
#> $z1
#> [1] 7 8
#>
#> $z2
#> [1] NA 7 8
#>
#> $z3
#> [1] 7 NA 8
data.frame(df)
#> Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : arguments imply differing number of rows: 3, 2
data.frame(df[-3])
#> a b z2 z3
#> 1 1 4 NA 7
#> 2 2 5 7 NA
#> 3 3 6 8 8
uj5u.com熱心網友回復:
只是要補充一點,如果您使用此語法,它可以作業:
df = data.frame(a=c(1, 2, 3, 4),
b=c(4, 5, 6, 6))
df[c(2, 3), 3] <- 1
看來,如果您使用df$something
,則需要實體化最后一行。
df$z[4] <- 1 # works
但 :
df$z[1/2/3] <- 1 # do not works
但是,如果您分兩步進行操作,則可以:
df$z <- 1
df$z[1/2/3] <- 1
所以我沒有好的答案,但這可能是答案的一步。阿克倫給出了答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/491343.html
上一篇:根據另一個R檢查一列的值