我希望我的数据框中引用的元素被替换为我放入函数的参数,但是目前它只是用我用来初始定义函数的参数替换元素(我发现它很难解释 - 希望我的代码和图片能够澄清一点!)
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比较新,所以任何解释都很受欢迎。
答案 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列,包括runkey
和project
。 project
在此处初始化为后续与数据框名称连接的字符列。
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.table
。 rbindlist(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[]