【问题标题】:A function for referring to columns by either name or index通过名称或索引引用列的函数
【发布时间】:2019-11-27 18:55:46
【问题描述】:

我希望能够在一个向量中按名称和索引来引用列。作为示例,我仅指定:

编辑:我更改了原始向量的顺序,因为我希望顺序无关紧要。

columns <- c(1:7, "j", 8, "i")

然后我想检索索引 1 到 9 的名称并将它们添加到向量中(在正确的位置)。我有一个大致的想法,但在编码方面我还没有走得太远:

library(data.table)
df <- fread(
"a b c d e f g h i j
1 2 3 4 5 6 7 8 9 10",
  header = TRUE
)

function(data, columns){
nums <- as.numeric(columns)
named_columns <- ?
nums <- nums[!is.na(nums)]
name_nums <- colnames(df)[nums]

all_columns <- setdiff(named_colums, name_nums)
# Order of the original vector?
column_names <- result
}

然后将其返回到向量中,结果将是:

column_names <- c("a", ..., "j", "h", "i")

谁能帮我更进一步?

【问题讨论】:

    标签: r string function vector numeric


    【解决方案1】:

    如果我理解您的问题,您想传递一个包含列名和索引的向量,并且您想返回一个仅包含列索引的向量。那么以下应该会有所帮助;

    df <- data.table::fread("a b c d e f g h i j
                             1 2 3 4 5 6 7 8 9 10",
                                                   header = TRUE)
    columns <- c(1:8, "i", 9, "j")
    
    
    col2num <- function(df, columns){
                  nums <- as.numeric(columns)
                  nums[is.na(nums)] <- which(names(df)==columns[is.na(nums)])
                  return(nums)
                }
    
    col2num(df, columns)
    #> Warning in col2num(df, columns): NAs introduced by coercion
    #>  [1]  1  2  3  4  5  6  7  8  9  9 10
    

    【讨论】:

    • 非常感谢!我最初打算将列名作为输出而不是索引,但我想这只是一小步。我现在就用我的实际数据试试。
    • @Tom 表示 return(names(df)[nums]) 可以代替 return(nums)。 p.s.在这种情况下,我会将函数命名为 col2name ;)
    • 我将您的答案与此处提出的 movemedatatable 解决方案相结合:stackoverflow.com/questions/18339370/… 以便在列中轻松移动。奇迹般有效。太感谢了! (我想要这些名称,因为它们与索引相比不会改变)
    • 我一直在尝试将一个对象(列名向量)传递给您的解决方案,但我收到一个错误Error in nums[is.na(nums)] &lt;- which(names(data) == colnums[is.na(nums)]):replacement has length zero 有什么理由这不应该工作吗?
    • 当您说 列名向量 时,您的意思是:c("i", "j")?在我的脑海中,我认为它应该仍然有效。也许用可重现的例子发布另一个问题:?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2017-10-09
    • 2013-05-22
    • 2019-12-09
    • 1970-01-01
    • 2013-08-04
    相关资源
    最近更新 更多