【问题标题】:'names' attribute [4000] must be the same length as the vector [5]'names' 属性 [4000] 必须与向量 [5] 的长度相同
【发布时间】:2021-05-17 21:15:50
【问题描述】:

每当我尝试更改列表中数据框的名称时,都会遇到错误。我认为这是由于我尝试更改的名称与数据框中的长度之间的长度不同。如果这似乎是重复的帖子,我深表歉意。如果是这种情况,我会删除,但如果有人能指出我正确的方向,我将不胜感激。

library(lubridate)
library(tidyverse)

date <- rep_len(seq(dmy("01-01-2010"), dmy("31-12-2013"), by = "days"),1000)
ID <- rep(c("A","B","C", "D", "E"), 100)

df <- data.frame(date = date,
                 x = runif(length(date), min = 60000, max = 80000),
                 y = runif(length(date), min = 800000, max = 900000),
                 ID)

df1 <- df %>% group_split(ID)

l <- list(1,2,3,4,5)

我已经能够使用它来尝试更改它,但尝试后出现错误:

for(i in 1: length(df1)){
  names(l) <- unlist(df1[[i]]$ID)
}

我正在尝试将这些值更改为 ID 值:

Error in names(l) <- unlist(df1[[i]]$ID) : 
  'names' attribute [200] must be the same length as the vector [5]

【问题讨论】:

  • 我不太确定你想做什么。请您进一步澄清一下吗? unlist(df1) 将变为 vector。为什么要将vector 分配给list 的“名称”?
  • 不一定是这样。我想要的输出是使用df1 列表中的ID 将图片中列表l 中的名称分配ID 值。在我的实际数据集中,ID 值太多,我无法在 c() 函数中列出它们,所以我希望找到一种更有效的方法来做到这一点。

标签: r dplyr tidyverse tidyr


【解决方案1】:

setNames 是你需要的:

setNames(l, unique(df$ID))

输出:

$A
[1] 1

$B
[1] 2

$C
[1] 3

$D
[1] 4

$E
[1] 5

【讨论】:

  • 如果l &lt;- list(1,2,3,4,5,1,2,3,4,5) 并且列表中有多个组件具有相同的ID,我需要做哪些更改?
  • @JohnHuang 在这种情况下你会这样做:setNames(l, c(unique(df$ID), unique(df$ID)))
  • 很抱歉继续添加此内容。我应该从一开始就更清楚。我想这将更准确地表示我的实际数据l &lt;- list(1,2,4,3,5,5,3,2,4,1)。顺序更加随机,但是这些值中的每一个都与ID 相关联,因此在这种情况下,1 将与A2B3C、等等。有没有一种方法可以将值与ID 链接起来,这样即使值是随机的,它也能工作?
猜你喜欢
  • 2019-12-26
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多