R:使用函数参数更新数据框中的元素

时间:2017-12-06 02:57:41

标签: r function dataframe

我希望我的数据框中引用的元素被替换为我放入函数的参数,但是目前它只是用我用来初始定义函数的参数替换元素(我发现它很难解释 - 希望我的代码和图片能够澄清一点!)

Project_assign <- function(prjct) {
  Truth_vector <- is.element((giraffe[,1]),(prjct[,1]))
  giraffe[which(Truth_vector),5] <- 'prjct'
  assign('giraffe' , giraffe , envir= .GlobalEnv)
}
Project_assign(spine_hlfs)

这主要是有效的,然而元素被替换为prjct而不是spine_hlfs  https://i.stack.imgur.com/uuPnv.png

如果我可以按预期工作,那么接下来我将创建一个包含所有项目名称的向量,并使用lapply与此函数一起为我每隔几个月节省大量的手工工作。我对R比较新,所以任何解释都很受欢迎。

2 个答案:

答案 0 :(得分:1)

听起来像基于查询数据框(列表)和主题数据框之间的match条目的简单替换。

以下是基于某些模拟数据的示例。

我首先模拟主题 dataframe的数据:

# Sample data
giraffe <- data.frame(
    runkeys = seq(1:500),
    col1 = runif(500),
    col2 = runif(500),
    col3 = runif(500),
    col4 = runif(500));

然后,我为2 查询 runkeys模拟dataframes数据:

spine_hlfs <- data.frame(
    runkeys = c(44, 260, 478));
ir_dia <- data.frame(
    runkeys = c(10, 20, 30))

查询 dataframes存储在list中:

lst.runkeys <- list(
    spine_hlfs = spine_hlfs,
    ir_dia = ir_dia);

要标记任何查询 runkeys中的dataframes个条目,我们可以使用for循环来match {{1}来自每个查询的条目 runkeys

dataframe

匹配# This is the critical line that loops through the dataframe # and flags runkeys in giraffe with the name of the query dataframe for (i in 1:length(lst.runkeys)) { giraffe[match(lst.runkeys[[i]]$runkeys, giraffe$runkeys), 5] <- names(lst.runkeys)[i]; } 条目后,这是主题 dataframe的输出。我只显示第5列中的条目被替换的行。

runkeys

答案 1 :(得分:0)

就我从许多评论中理解OP的意图而言,他希望使用其中许多其他数据框的名称更新giraffe数据框runkey 1}}匹配。

这可以通过将其他数据框组合成一个data.table对象将数据框名称视为数据 并最终更新giraffe来实现。加入。

样本数据

根据OP,giraffe包含500行和5列,包括runkeyprojectproject在此处初始化为后续与数据框名称连接的字符列。

set.seed(123L) # required for reproducible data
giraffe <- data.frame(runkey = 1:500,
                      X2 = sample.int(99L, 500L, TRUE),
                      X3 = sample.int(99L, 500L, TRUE),
                      X4 = sample.int(99L, 500L, TRUE),
                      project = "",
                      stringsAsFactors = FALSE)

然后有许多数据框只包含一列runkey。根据OP,runkey是析取的,即所有runkey的组合集不包含任何重复项。

spine_hlfs <- data.frame(runkey = c(1L, 498L, 5L))
ir_dia     <- data.frame(runkey = c(3L, 499L, 47L, 327L))

提议的解决方案

# specify names of data frames
df_names <- c("spine_hlfs", "ir_dia")
# create named list of data frames 
df_list <- mget(df_names)
# update on join 
library(data.table)
setDT(giraffe)[rbindlist(df_list, idcol = "df.name"), on = "runkey", project := df.name][]
     runkey X2 X3 X4    project
  1:      1  2 44 63 spine_hlfs
  2:      2 73 99 77           
  3:      3 43 20 18     ir_dia
  4:      4 73 12 40           
  5:      5  2 25 96 spine_hlfs
 ---                           
496:    496 75 45 84           
497:    497 24 63 43           
498:    498 33 53 81 spine_hlfs
499:    499  1 33 16     ir_dia
500:    500 99 77 41

解释

setDT()强制giraffe改为data.tablerbindlist(df_list, idcol = "df.name")从数据框列表中创建一个组合的data.table,从而在df.name列中填入列表元素的名称:

      df.name runkey
1: spine_hlfs      1
2: spine_hlfs    498
3: spine_hlfs      5
4:     ir_dia      3
5:     ir_dia    499
6:     ir_dia     47
7:     ir_dia    327

此中间结果已与runkey giraffe联接。 project列仅使用df.name的内容进行更新,仅用于匹配行。

替代解决方案

这是循环df_names并执行重复的加入,更新giraffe 到位

setDT(giraffe)
for (x in df_names) giraffe[get(x), on = "runkey", project := x]
giraffe[]