【问题标题】:Executing a function with paste to create a new variable in a dataframe in R使用粘贴执行函数以在 R 的数据框中创建新变量
【发布时间】:2016-06-28 06:04:01
【问题描述】:

数据:

structure(list(`p value` = c(0.00151124736422317, 0.804709799937324, 
0.0192537412780042, 0.000467854188597731, 4.80216666553605e-06, 
0.0231434946595433), significance = c(TRUE, FALSE, TRUE, TRUE, 
TRUE, TRUE)), .Names = c("p value", "significance"), row.names = c("Q5.i", 
"Q5.ii", "Q5.iii", "Q5.iv", "Q5.v", "Q5.vi"), class = "data.frame")

目标: 创建一个函数,该函数将输入数据框名称和(新)变量名称。 该函数将:

  1. 根据数据框的行名创建一个新变量
  2. 删除行名
  3. 对变量重新排序,以便新创建的 列是第一列

挑战: 我被困在第一步。

我已经在 Internet 和 stackoverflow 上搜索了可以提供帮助的 sn-ps 代码,尽管它无法正常工作,但我已经设法敲定了一些东西。 我尝试了什么:

row2col<-function(df, varname){
 eval(parse(text=paste(df, "[[", "'", varname, "'", "]]", "<-row.names(", df, ")", sep="")))
}


row2col<-function(df, varname){
  assign(parse(text=paste(df, varname, sep="$")), row.names(df))
}

结果:

  1. 什么也没发生(甚至没有错误消息)
  2. 已创建行名称的字符向量(而不是数据框中的变量)

感谢您对本文的帮助和关注。

【问题讨论】:

  • R 经验法则 - 如果您曾经使用过 eval assign parse.... 不要。 :-)
  • 这个函数已经存在,如dplyr::add_rownames()tibble::rownames_to_column()
  • @alistaire 感谢您的分享。我广泛使用 dplyr 包,甚至没有注意到它已经在里面了。

标签: r function


【解决方案1】:

您不需要使用evalparseassign - 在很多情况下这不是正确的方法。这是一个简单的替代方案:

row2col <- function(dat, varname) {
  dat[[varname]] <- row.names(dat)  
  row.names(dat) <- NULL
  dat[, c(varname, setdiff(names(dat), varname))]
}

然后你就可以测试了:

> row2col(df, "testcol")
#  testcol      p value significance
#1    Q5.i 1.511247e-03         TRUE
#2   Q5.ii 8.047098e-01        FALSE
#3  Q5.iii 1.925374e-02         TRUE
#4   Q5.iv 4.678542e-04         TRUE
#5    Q5.v 4.802167e-06         TRUE
#6   Q5.vi 2.314349e-02         TRUE

【讨论】:

  • 而我只为第一个目标奋斗了半天……非常感谢!!!
【解决方案2】:

使用行名创建新变量。

data$new_var <- row.names(data)

重置行名

row.names(data) <- NULL

先用新的 var 重新排序数据框

data <- data[, c(ncol(data):(ncol(data) - 1))]

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多