R 是否通过向量索引访问data.table列?

R 是否通过向量索引访问data.table列?,r,dataframe,data.table,dynamic-columns,R,Dataframe,Data.table,Dynamic Columns,我被一个问题困住了,但我在网上找不到令人满意的答案。我想使用start:end向量对data.frame(也是一个data.table)进行估值。举个例子来说明我的问题 假设我有一个data.frame,如下所示: df <- data.frame(col_1 = rep(0, 3), col_2 = rep(0, 3), col_3 = rep(0, 3), col_4 = rep(0,3)) df col_1 col_2 col_3 col_4 1 0 0

我被一个问题困住了,但我在网上找不到令人满意的答案。我想使用start:end向量对data.frame(也是一个data.table)进行估值。举个例子来说明我的问题

假设我有一个data.frame,如下所示:

df <- data.frame(col_1 = rep(0, 3), col_2 = rep(0, 3), col_3 = rep(0, 3), col_4 = rep(0,3))
df
  col_1 col_2 col_3 col_4
1     0     0     0     0
2     0     0     0     0
3     0     0     0     0
  col_1 col_2 col_3 col_4
1     1     1     0     0
2     0     1     1     1
3     1     1     1     0
我试过这样的方法:

df[ , indexesStart:indexesEnd] <- 1
df[,indexesStart:indexesEnd]这样做:

df <- data.frame(col_1=rep(0,3),col_2=rep(0,3),col_3=rep(0,3),col_4=rep(0,3))
indexesStart <- c(1, 2, 1)
indexesEnd   <- c(2, 4, 3)

for (i in 1:nrow(df)) df[i, indexesStart[i]:indexesEnd[i]] <- 1

df

df试试这个,它避免了任何循环或重叠,并且是矢量化的。这充分利用了data.frame实际上是一个列表这一事实

impute <- function(lst, start, end){ lst[start:end] <- 1; lst }

fill <- function(df, start, end){
  cols <- names(df)
  lst <- as.list(as.data.frame(t(df)))
  res <- as.data.frame(t(Vectorize(impute)(lst, start, end)))
  names(res) <- names(df)
  row.names(res) <- row.names(df)
  res
}

res <- fill(df, indexesStart, indexesEnd)

impute谢谢,但是我需要避免循环在我的第二个变体中我隐藏了循环(而隐藏的循环在另一个地方)。第二个变体工作得非常快(不到一秒钟)。我不得不做一些调整,因为(我没有在帖子中详细说明这一方面,以便更容易实现),因为对于每一行,我都有多个列范围(长度(索引)>dim(df)[1]),但我能够通过索引映射来管理这一点。现在,如果我查看(或打印)df[i]一切正常,但当我做作业时,它会说:[i]中的错误,我解决了它:映射引入了坐标重复。使用唯一(i)一切正常。从1600到2秒。非常感谢。我认为没有循环(以一种或另一种形式)是无法做到的因为对于每一行,您都有另一组值需要更改。此解决方案同样有效,但jogo的方法更快!谢谢:)
I <- do.call(rbind, lapply(1:length(indexesStart), function(i) cbind(i, indexesStart[i]:indexesEnd[i])))
df[I] <- 1
impute <- function(lst, start, end){ lst[start:end] <- 1; lst }

fill <- function(df, start, end){
  cols <- names(df)
  lst <- as.list(as.data.frame(t(df)))
  res <- as.data.frame(t(Vectorize(impute)(lst, start, end)))
  names(res) <- names(df)
  row.names(res) <- row.names(df)
  res
}

res <- fill(df, indexesStart, indexesEnd)