R 基于向量重叠替换数据帧列中的值

R 基于向量重叠替换数据帧列中的值,r,for-loop,replace,R,For Loop,Replace,晚上好, 我有一个150.000行和7列的大型数据框,如下所示 ID cola colb colc cold cole colf XXXYYY 0 0 0 0 0 0 XXYYXX 0 0 0 0 0 0 XYXYXY 0 0 0 0 0 0 YYYXXX 0 0 0 0 0 0 ... 我的数据帧中还有向量veca、vecb、vec

晚上好,

我有一个150.000行和7列的大型数据框,如下所示

     ID cola colb colc cold cole colf
 XXXYYY    0    0    0    0    0    0
 XXYYXX    0    0    0    0    0    0
 XYXYXY    0    0    0    0    0    0
 YYYXXX    0    0    0    0    0    0
...
我的数据帧中还有向量veca、vecb、vecc、vecd、vece和vecf,它们包含ID的子集。 我想写一个循环,在这个循环中,我根据数据帧和向量之间ID号的重叠为列分配1。
例如,如果
veca你能发布它为什么不工作吗?您建议的代码为我生成了正确的输出:

    > ## Set up the dataframe d1
    > z4<-rep(0,4) # 4 zeros
    > d1<-data.frame(ID=c("XXXYYY","XXYYXX","XYXYXY","YYYXXX"), cola=z4,colb=z4,colc=z4,cold=z4,cole=z4,colf=z4)
    > veca<-c("XXXYYY","XXYYXX")
    > d1
          ID cola colb colc cold cole colf
    1 XXXYYY    0    0    0    0    0    0
    2 XXYYXX    0    0    0    0    0    0
    3 XYXYXY    0    0    0    0    0    0
    4 YYYXXX    0    0    0    0    0    0

    > ## change cola
    > d1$cola[d1$ID %in% veca ] <- 1
    > d1
          ID cola colb colc cold cole colf
    1 XXXYYY    1    0    0    0    0    0
    2 XXYYXX    1    0    0    0    0    0
    3 XYXYXY    0    0    0    0    0    0
    4 YYYXXX    0    0    0    0    0    0

    > ## Remove lines
    > d1<-d1[!(d1$ID %in% veca),]
    > d1
          ID cola colb colc cold cole colf
    3 XYXYXY    0    0    0    0    0    0
    4 YYYXXX    0    0    0    0    0    0
##设置数据帧d1
>z4 d1维卡d1
我要可乐
1 XXXYYY 0 0 0 0
2 XXYYXX 0 0 0 0 0 0
3 XYXY 0 0 0 0 0 0 0 0
4 YYYYXXX 0 0 0 0 0 0 0
>##换可乐
>d1$cola[d1$ID%在%veca中]d1
我要可乐
1 XXXYYY 1 0 0 0 0 0
2 XXYYXX 1 0 0 0 0 0
3 XYXY 0 0 0 0 0 0 0 0
4 YYYYXXX 0 0 0 0 0 0 0
>##拆下管路
>首被告
我要可乐
3 XYXY 0 0 0 0 0 0 0 0
4 YYYYXXX 0 0 0 0 0 0 0

你能告诉我为什么它不起作用吗?您建议的代码为我生成了正确的输出:

    > ## Set up the dataframe d1
    > z4<-rep(0,4) # 4 zeros
    > d1<-data.frame(ID=c("XXXYYY","XXYYXX","XYXYXY","YYYXXX"), cola=z4,colb=z4,colc=z4,cold=z4,cole=z4,colf=z4)
    > veca<-c("XXXYYY","XXYYXX")
    > d1
          ID cola colb colc cold cole colf
    1 XXXYYY    0    0    0    0    0    0
    2 XXYYXX    0    0    0    0    0    0
    3 XYXYXY    0    0    0    0    0    0
    4 YYYXXX    0    0    0    0    0    0

    > ## change cola
    > d1$cola[d1$ID %in% veca ] <- 1
    > d1
          ID cola colb colc cold cole colf
    1 XXXYYY    1    0    0    0    0    0
    2 XXYYXX    1    0    0    0    0    0
    3 XYXYXY    0    0    0    0    0    0
    4 YYYXXX    0    0    0    0    0    0

    > ## Remove lines
    > d1<-d1[!(d1$ID %in% veca),]
    > d1
          ID cola colb colc cold cole colf
    3 XYXYXY    0    0    0    0    0    0
    4 YYYXXX    0    0    0    0    0    0
##设置数据帧d1
>z4 d1维卡d1
我要可乐
1 XXXYYY 0 0 0 0
2 XXYYXX 0 0 0 0 0 0
3 XYXY 0 0 0 0 0 0 0 0
4 YYYYXXX 0 0 0 0 0 0 0
>##换可乐
>d1$cola[d1$ID%在%veca中]d1
我要可乐
1 XXXYYY 1 0 0 0 0 0
2 XXYYXX 1 0 0 0 0 0
3 XYXY 0 0 0 0 0 0 0 0
4 YYYYXXX 0 0 0 0 0 0 0
>##拆下管路
>首被告
我要可乐
3 XYXY 0 0 0 0 0 0 0 0
4 YYYYXXX 0 0 0 0 0 0 0
#添加
lstcol
#addones

lstcol您可以使用
行/列
索引

lst <- mget(paste0('vec', letters[1:6]))
d2 <- stack(lst)
d1[-1][cbind(match(d2$values, d1$ID),
   match(substr(d2$ind, 4,4), substr(names(d1)[-1], 4,4)))] <- 1
d1
#      ID cola colb colc cold cole colf
#1 XXXYYY    1    0    1    0    1    1
#2 XXYYXX    1    0    0    0    0    0
#3 XYXYXY    0    1    0    1    0    1
#4 YYYXXX    0    0    1    0    0    0

lst您可以使用
行/列
索引

lst <- mget(paste0('vec', letters[1:6]))
d2 <- stack(lst)
d1[-1][cbind(match(d2$values, d1$ID),
   match(substr(d2$ind, 4,4), substr(names(d1)[-1], 4,4)))] <- 1
d1
#      ID cola colb colc cold cole colf
#1 XXXYYY    1    0    1    0    1    1
#2 XXYYXX    1    0    0    0    0    0
#3 XYXYXY    0    1    0    1    0    1
#4 YYYXXX    0    0    1    0    0    0


lst该问题询问如何一次循环所有向量
vec[a]
和列的过程。该问题询问如何一次循环所有向量
vec[a]
和列的过程。索引的好主意。我不经常使用
堆栈
来研究应用程序+1@plafort谢谢,我认为这里不需要
匹配
部件(因为它是订购的)。在这种情况下,假设顺序相同,我们可以将lst的名称设置为1:7,在
stack
之后转换为数字,然后将其用作列索引。非常抱歉@akrun,我认为是向量的对象实际上是列表。所以veca可能是:1 XXXYYY 2 XXYYXX这会破坏堆叠。有没有办法克服这个问题?@Sigugeir你是说
vec是索引的好主意。我不经常使用
堆栈
来研究应用程序+1@plafort谢谢,我认为这里不需要
匹配
部件(因为它是订购的)。在这种情况下,假设顺序相同,我们可以将lst的名称设置为1:7,在
stack
之后转换为数字,然后将其用作列索引。非常抱歉@akrun,我认为是向量的对象实际上是列表。所以veca可能是:1 XXXYYY 2 XXYYXX这会破坏堆叠。有没有办法克服这个问题?@Sigugeir你是说
veca另一个选择是使用
Map
,即
myfunc谢谢!我在考虑用
mapply
来代替for循环。什么都没用。我需要函数按第I个元素遍历COL列表和VEC列表。所以
Map
是正确的。明白了这似乎是一个很好的解决方案,我非常愿意应用。我的问题中确实犯了一个相当愚蠢的错误,然而,我认为是向量的对象实际上是列表。您认为可以使用list objects@plafort提供类似的解决方案吗?非常感谢,很抱歉搞砸了。请在您的问题中添加一个列表示例。对不起,我是新用户,似乎找不到编辑原始问题的位置。下面是我的一个列表的示例:列表不包含数字(有些明显),这些数字表示每个ID的行(它是一个包含多行的单列)
标题(示例列表)ID 1 XXXXXX 2 yyyy x 3 xxxyy 4 XXYYXX 5 xxxxx y 6 xxxxxxyy
另一个选项将使用
Map
,也就是说,
myfunc谢谢!我在考虑用
mapply
来代替for循环。什么都没用。我需要函数按第I个元素遍历COL列表和VEC列表。所以
Map
是正确的。明白了这似乎是一个很好的解决方案,我非常愿意应用。我的问题中确实犯了一个相当愚蠢的错误,然而,我认为是向量的对象实际上是列表。您认为可以使用list objects@plafort提供类似的解决方案吗?非常感谢,很抱歉搞砸了。请在您的问题中添加一个列表示例。对不起,我是新用户,似乎找不到编辑原始问题的位置。下面是我的一个列表的示例:列表(有些明显)不包含数字,这些数字表示每个ID的行(它是一个包含多行的单列)
head(示例列表)ID 1 XXXXXX 2 yyyy x 3 xxxyy 4 XXYYXX 5 xxxxx y 6 XXXXYY
lst <- mget(paste0('vec', letters[1:6]))
d2 <- stack(lst)
d1[-1][cbind(match(d2$values, d1$ID),
   match(substr(d2$ind, 4,4), substr(names(d1)[-1], 4,4)))] <- 1
d1
#      ID cola colb colc cold cole colf
#1 XXXYYY    1    0    1    0    1    1
#2 XXYYXX    1    0    0    0    0    0
#3 XYXYXY    0    1    0    1    0    1
#4 YYYXXX    0    0    1    0    0    0
IDstoremove <- Reduce(`intersect`, lst) #in this example, none
d1[!(d1$ID %in% IDstoremove),]
d1 <- structure(list(ID = c("XXXYYY", "XXYYXX", "XYXYXY", "YYYXXX"), 
cola = c(0L, 0L, 0L, 0L), colb = c(0L, 0L, 0L, 0L), colc = c(0L, 
0L, 0L, 0L), cold = c(0L, 0L, 0L, 0L), cole = c(0L, 0L, 0L, 
0L), colf = c(0L, 0L, 0L, 0L)), .Names = c("ID", "cola", 
"colb", "colc", "cold", "cole", "colf"), class = "data.frame", 
row.names = c(NA, -4L))

veca<-c("XXXYYY","XXYYXX")
vecb <- 'XYXYXY'
vecc <- c('XXXYYY', 'YYYXXX')
vecd <- 'XYXYXY'
vece <- 'XXXYYY'
vecf <- c('XXXYYY', 'XYXYXY')