【问题标题】:Convert list to named list in R [duplicate]将列表转换为R中的命名列表[重复]
【发布时间】:2016-08-20 22:37:28
【问题描述】:

我是 R 语言的新手。我想更改列表元素编号的名称。

目前我有这样的列表:(来自 R Studio 的屏幕截图)

> Degrees_df1
[[1]]
[1] "MCA"

[[2]]
[1] "B.Com"

[[3]]
[1] "XII"

[[4]]
[1] "X"

我想这样转换:

> Degrees_df1
$Degrees1
[1] "MCA"

$Degrees2
[1] "B.Com"

$Degrees3
[1] "XII"

$Degrees4
[1] "X"

我是 R 语言的新手,任何形式的帮助都会感谢我。在此先感谢.......

【问题讨论】:

    标签: r


    【解决方案1】:

    所以你希望你的列表有名字:

    NAME <- paste0("Degrees", 1:length(Degrees_df1))
    

    以下任何一项都可以:

    names(Degrees_df1) <- NAME
    
    attr(Degrees_df1, "names") <- NAME
    
    Degrees_df1 <- "names<-"(Degrees_df1, NAME)
    
    Degrees_df1 <- setNames(Degrees_df1, NAME)
    
    Degrees_df1 <- structure(Degrees_df1, names = NAME)
    

    但我认为,最好的办法是在创建列表时给出名称。例如,如果你这样做:

    list(1, 2, 3, 4)
    

    结果列表没有名称。如果你这样做了

    list(a = 1, b= 2, c = 3, d = 4)
    

    结果列表有名字。


    如果我在那里应用粘贴功能,我会收到如下错误:

    分配错误(names(paste0("Degrees_df", i)), paste0("Degrees", 1:length(get(paste0("Degrees_df", : 无效的第一个参数)"

    抱歉,我想使用粘贴函数修改你的 for 循环内的代码。

    你可能需要这个(效率不高):

    df_i <- get(paste0("Degrees_df", i))   ## a local variable
    names(df_i) <- paste0("Degrees", 1:length(df_i))    ## modify local variable
    assign(paste0("Degrees_df", i), df_i)   ## write back and update
    

    或(更好):

    df_i <- get(paste0("Degrees_df", i))   ## a local variable
    assign(paste0("Degrees_df", i),
           setNames(df_i, paste0("Degrees", 1:length(df_i))))
    # assign(paste0("Degrees_df", i),
    #        "names<-"(df_i, paste0("Degrees", 1:length(df_i))))
    # assign(paste0("Degrees_df", i),
    #        structure(df_i, names = paste0("Degrees", 1:length(df_i))))
    

    assign 用于为变量赋值(或另一个变量)。看起来您的错误代码试图分配名称属性。注意,列表/data.frame 的名称是“属性”,而不是变量,所以不能使用assign 更改它们。

    【讨论】:

    • 嗨@Zheyuan Li 如果我在那里应用粘贴功能,我会收到这样的错误:分配错误(names(paste0(“Degrees_df”,i)),paste0(“Degrees”,1 :length(get(paste0("Degrees_df", : 第一个参数无效
    • 对不起@Zheyuan Li 我想用粘贴功能修改你的for循环里面的代码。请帮我解决这个问题..
    • @ZheyuanLi ;我认为你的编辑应该有一个更强烈的警告,如果他们试图这样做,操作人员应该重新考虑他们的工作流程
    • 我认为在 for 循环中使用 getassign 将名称添加到列表中几乎肯定不会继续进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多