R - 如果列名是值的一部分,我可以让 R 识别吗?
R - Can I make R recognize if name of column is part of value?
如您所见,数据非常大。因此,在代码中命名列是不可取的。老实说,我不知道如何解决这个问题。
顺便说一句,如果因为一个ID列太复杂,我也可以把它分成更多的ID变量。像这样:
感谢大家的帮助!
我们可以连续做吗,比如说长度 11?如果是这样,我们可以做到 data.frame。您认为 ID 中的 +
可能是一种烦恼,这一点已得到同意。对一小行执行此操作就像制作一个最小的工作示例。我们的朋友 gsub
、names
和 strsplit
可以提供帮助。
首先我们会做一个代表 'row':
name_col <- c('ID', '10', '600', '2000', '76', '240', '42', '3010', '999', '3000', '6')
您将获得 data.frame 中所有列的名称:
my_df_names <- names(my_df)
但我们将坚持上面的行,并在列名中创建 ID 元素的索引,列名在前:
> row_idx <- name_col %in% unlist(strsplit(gsub(' + ', ' ', ID_with_plus, fixed = TRUE), ' '))
> row_idx
[1] FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE
这看起来不错,所以按行分配结果,使用索引按索引设置 1/0 值。下一部分是迭代地创建和使用索引。我通常会从 for
循环开始,但首先我们会创建一个空列表来接收所有索引。我们已经有了 my_df_names
,我们将把 unlist(strsplit(gsub(' + ', ' ', ID_with_plus, fixed = TRUE), ' '))
指向 my_df$ID,而不是前面的示例行:
my_many_idxs <- list()
for (j in 1:nrow(my_df) {
my_many_idxs[[j]] <- my_df_names %in% unlist(strsplit(gsub(' + ', ' ', my_df$ID[j], fixed = TRUE), ' '))
}
这有望产生 300k 长度的列表。如果你的内存爆炸了,也许你一次做 100k。现在做另一个 for
循环使用索引设置值。请注意上面使用的 [[
和 [
的区别,[[
用于列表值,[
用于矢量。我们已经有 'my_df' 和 'my_many_idxs',所以我们不需要制作一个对象来接收。
for (k in 1:length(my_many_idxs) {
my_df[k, ] <- ifelse(my_many_idxs[[k]], 1, 0)
}
我想我们可以到达那里,但我没有 300kx4k df,所以想象这会起作用。再次注意 [[
表示列表中的内容,[
表示向量中的内容。让我知道。
如您所见,数据非常大。因此,在代码中命名列是不可取的。老实说,我不知道如何解决这个问题。
顺便说一句,如果因为一个ID列太复杂,我也可以把它分成更多的ID变量。像这样:
感谢大家的帮助!
我们可以连续做吗,比如说长度 11?如果是这样,我们可以做到 data.frame。您认为 ID 中的 +
可能是一种烦恼,这一点已得到同意。对一小行执行此操作就像制作一个最小的工作示例。我们的朋友 gsub
、names
和 strsplit
可以提供帮助。
首先我们会做一个代表 'row':
name_col <- c('ID', '10', '600', '2000', '76', '240', '42', '3010', '999', '3000', '6')
您将获得 data.frame 中所有列的名称:
my_df_names <- names(my_df)
但我们将坚持上面的行,并在列名中创建 ID 元素的索引,列名在前:
> row_idx <- name_col %in% unlist(strsplit(gsub(' + ', ' ', ID_with_plus, fixed = TRUE), ' '))
> row_idx
[1] FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE
这看起来不错,所以按行分配结果,使用索引按索引设置 1/0 值。下一部分是迭代地创建和使用索引。我通常会从 for
循环开始,但首先我们会创建一个空列表来接收所有索引。我们已经有了 my_df_names
,我们将把 unlist(strsplit(gsub(' + ', ' ', ID_with_plus, fixed = TRUE), ' '))
指向 my_df$ID,而不是前面的示例行:
my_many_idxs <- list()
for (j in 1:nrow(my_df) {
my_many_idxs[[j]] <- my_df_names %in% unlist(strsplit(gsub(' + ', ' ', my_df$ID[j], fixed = TRUE), ' '))
}
这有望产生 300k 长度的列表。如果你的内存爆炸了,也许你一次做 100k。现在做另一个 for
循环使用索引设置值。请注意上面使用的 [[
和 [
的区别,[[
用于列表值,[
用于矢量。我们已经有 'my_df' 和 'my_many_idxs',所以我们不需要制作一个对象来接收。
for (k in 1:length(my_many_idxs) {
my_df[k, ] <- ifelse(my_many_idxs[[k]], 1, 0)
}
我想我们可以到达那里,但我没有 300kx4k df,所以想象这会起作用。再次注意 [[
表示列表中的内容,[
表示向量中的内容。让我知道。