【问题标题】:Data.table error in R for preparing for regression analysisR中的Data.table错误,用于准备回归分析
【发布时间】:2020-07-18 15:50:21
【问题描述】:

我正在尝试准备我的变量以在回归分析中使用这些数据。创建以下数据表时出现错误。我需要准备数据以显示成员每年参与辩论的次数 (n_Edu),并在旁边包含其他相关变量。除了 days_in_house 变量之外,所有变量似乎都很好。这是我的代码。

library(data.table)

df1 <- data.table(df1)

mp_by_year <- df1[,list(n_parent_Edu = sum(parent_Edu), isFemale = unique(isFemale), party = unique(party), days_in_house = unique(days_in_house)), by = list(member_id, year)]

当我在没有 day_in_house 变量的情况下运行此代码(即仅使用 isFemale、parent_Edu、member_id、year 和 party 变量)时,它可以正常工作并生成一个新的数据框。但是,当我添加此变量时,它给了我以下错误。变量如下所示:

days_in_house
1647
6383
463
3528
462
3639
16
1738
16
187
3732

...等等。将此变量添加到数据表时出现以下错误:

“为第 242 组的第 3 列提供 2 个项目,该列有 5 行。RHS 长度必须为 1(单个值可以)或与 LHS 长度完全匹配。如果您希望“回收”RHS,请使用 rep () 明确地向您的代码的读者表明这一意图。”

我的其他变量如下所示:

是女性

0
1
0
0
0
0
1

派对

Conervative
Labour
Liberal Democrats
Conservative
Conervative
Labour

membership_id

463
283
352
287
27
372

年份

1997
1997
1997
1997
1997

【问题讨论】:

  • 如果没有看到可重现的数据,很难确定(请参阅stackoverflow.com/questions/5963269/…),但我认为问题在于,对于该组,前面的列定义之一产生 4 行,而最后一个产生2(1或4都可以)。因此,问题不一定是 days_in_house 变量。我会验证每次使用 unique 都会返回一个值(或预期的值数)每个(member_id,year),例如df1[,uniqueN(isFemale),list(member_id,year)][N != &lt;expected_value]

标签: r data.table


【解决方案1】:

问题在于unique 可以返回可变数量的结果。对于您的某些字段,结果有 5 行,而其他字段可能不同。这是错误的简单表示:

library(data.table)

dt = data.table(grp = 1L,
           party = c("A", "A", "B"),
           days = 1:3,
           val = rnorm(3L))

dt
#>      grp  party  days       val
#>    <int> <char> <int>     <num>
#> 1:     1      A     1 -0.946899
#> 2:     1      A     2 -2.094639
#> 3:     1      B     3  1.033007

dt[ ,
   .(sum(val), unique(party), unique(days)),
   by = grp
   ]
#> Error in `[.data.table`(dt, , .(sum(val), unique(party), unique(days)), : Supplied 2 items for column 2 of group 1 which has 3 rows. The RHS length must either be 1 (single values are ok) or match the LHS length exactly. If you wish to 'recycle' the RHS please use rep() explicitly to make this intent clear to readers of your code.

问题是 unique(party) 产生 2 条记录,而 grp 有 3 条记录。听起来您实际上想要做的是按更多项目分组以显示独特的所有内容:

dt[,
   .(sum(val)),
   by = .(grp, party, days)]
#>      grp  party  days          V1
#>    <int> <char> <int>       <num>
#> 1:     1      A     1  0.87004621
#> 2:     1      A     2 -2.36972622
#> 3:     1      B     3  0.05793804

对于您的数据集,您将使用:

df1[ , 
    .(n_parent_Edu = sum(parent_Edu)), 
    by = .(member_id, year, isFemale, party, days_in_house)]

对于未来的问题,最好像我上面所做的那样简化数据集。或者,在最坏的情况下,您可以使用dput(head(df1, 10L)) 或修改数据集以重现问题。

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 2023-03-15
    • 2018-07-26
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2018-01-06
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多