R 基于向量重叠替换数据帧列中的值
晚上好, 我有一个150.000行和7列的大型数据框,如下所示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
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')