【发布时间】:2021-06-09 17:38:32
【问题描述】:
这里是初学者 R 用户。我正在练习制作自己的函数,并且我想制作一些可以减少为我保存的数据框重命名行/列的时间的东西。以下是我想出的:
data.change.rowcolnames <- function(datainenv, namerows, namecols) {
row.names(datainenv) <- namerows
colnames(datainenv) <- namecols
}
基本上,“datainenv”是命名的数据框,“namerows”/“namecols”是包含所有我想要的行/列名称的向量。
这是我尝试使用上述函数运行的代码:
data.change.rowcolnames(inflam_01, inflam_01_pats, inflam_01_days)
当我运行它时,它不会更改行/列名称。但是,当我自己运行 row.names() 和 colnames() 函数时,它们会运行。
这是我必须设置的所有内容,只是患者炎症的一些样本数据(没有违反 HIPAA!都是假的......)
inflam_01 <- read.csv("inflammation-01.csv", header = F) #can't attach file...but the dataframe was created correctly and I can see all the data.
使用我在网上找到的唯一 id 函数来帮助生成随机患者 ID:
create_unique_ids <- function(n, seed_no = 2, char_len = 5){
set.seed(seed_no)
pool <- c(letters, LETTERS, 0:9) #sets the parameters for what the ID will contain
res <- character(n) # pre-allocating vector is much faster than growing it
for(i in seq(n)){
this_res <- paste0(sample(pool, char_len, replace = TRUE), collapse = "")
while(this_res %in% res){ # if there was a duplicate, redo
this_res <- paste0(sample(pool, char_len, replace = TRUE), collapse = "")
}
res[i] <- this_res
}
res
}
使用该函数为以下向量生成 60 个 id:
inflam_01_pats <- c(create_unique_ids(60, 2, 10)) #used a function example for the "create_unique_ids";
为“日期名称”创建了一个带有数字 1-40 的向量
inflam_01_days <- c(1:40)
将它们加在一起,它似乎可以工作,因为它没有显示错误消息...但默认的列/行名称仍在 inflam_01 数据框中...
【问题讨论】:
-
使用
inflam_01 <- data.change.rowcolnames(inflam_01, inflam_01_pats, inflam_01_days)是否有效? -
函数最后一行应该是
datainenv或者return(datainenv) -
正如 rawr 所提到的,R 返回函数中最后一行的结果(除了特定的中断条件)。因此,您得到的是
colnames(datainenv) <- namecols的结果。使用return(datainenv),您可以返回更改后的对象。 -
好的,这是有道理的。我已经让它这样工作了。但现在如果只是在控制台中吐出它。如何让它在我的环境中保存新对象?换了个新名字?
-
我找到了一种解决方法,但它并不像我希望的那样精简......我使用了
inflam_01_named <<- data.change.rowcolnames(inflam_01, inflam_01_pats, inflam_01_days),这在我的环境中创建了一个新的 df。但是,你们都知道我如何在函数本身中做到这一点(提供输出的新名称作为参数)?