R 在列范围内矢量化名称替换
我有一个大的数据集,所以这是一个玩具的例子 这是数据帧df 我想使用这里提供的键取消标识Target和Partner列的每个成员R 在列范围内矢量化名称替换,r,vectorization,R,Vectorization,我有一个大的数据集,所以这是一个玩具的例子 这是数据帧df 我想使用这里提供的键取消标识Target和Partner列的每个成员 structure(list(name = structure(c(2L, 5L, 1L, 6L, 4L, 3L), .Label = c("Andrew", "Jim", "Kurt", "Lester", "Mickey", "Taylor"), class = "factor"), id = structure(c(2L, 5L, 1L, 6L, 4
structure(list(name = structure(c(2L, 5L, 1L, 6L, 4L, 3L), .Label = c("Andrew",
"Jim", "Kurt", "Lester", "Mickey", "Taylor"), class = "factor"),
id = structure(c(2L, 5L, 1L, 6L, 4L, 3L), .Label = c("A3",
"J9", "K5", "L4", "M4", "T7"), class = "factor")), class = "data.frame", row.names = c(NA,
-6L))
我知道您可以用这种方式分别替换每列的名称
df[["Partner1"]] <- key[ match(df[['Partner1']], key[['name']] ) , 'id']
但我想对它进行矢量化,这样我就可以在所有列中并行地将键中的每个名称重新编码为它对应的id
真正的数据将是数百列,其中大约30列将是我想要取消识别的列
有什么建议吗 使用tidyverse的一种可能性:
首先,它执行宽-长数据转换。其次,它将转换后的df与df2连接起来。如果df2中有一个ID表示df中的名称,它将用该ID替换df中的名称,否则用NA替换。最后,它将数据转换回原始格式
或基本R解决方案:
data.frame(apply(df[, -2], 2, function(x) as.character(df2$id)[match(x, as.character(df2$name))]),
Gender = df[, 2])
Target Partner1 Partner2 Partner4 Gender
1 J9 A3 J9 <NA> M
2 <NA> T7 K5 L4 F
3 T7 T7 A3 J9 F
4 K5 J9 M4 L4 M
5 L4 M4 K5 A3 M
# Create lookup vector
lu_vect <- setNames(as.character(df2[["id"]]), df2[["name"]])
lu_vect
# Jim Mickey Andrew Taylor Lester Kurt
# "J9" "M4" "A3" "T7" "L4" "K5"
# Make a list of columns we want to *update*
cols_to_anonymise <- c("Target", "Partner1", "Partner2", "Partner4")
# Anonymise column by column, if name is not in key, replace by NA
df[cols_to_anonymise] <- lapply(
df[cols_to_anonymise],
function(x) lu_vect[as.character(x)]
)
# Print out results
df
# Target Gender Partner1 Partner2 Partner4
# 1 J9 M A3 J9 <NA>
# 2 <NA> F T7 K5 L4
# 3 T7 F T7 A3 J9
# 4 K5 M J9 M4 L4
# 5 L4 M M4 K5 A3
使用tidyverse的一种可能性:
首先,它执行宽-长数据转换。其次,它将转换后的df与df2连接起来。如果df2中有一个ID表示df中的名称,它将用该ID替换df中的名称,否则用NA替换。最后,它将数据转换回原始格式
或基本R解决方案:
data.frame(apply(df[, -2], 2, function(x) as.character(df2$id)[match(x, as.character(df2$name))]),
Gender = df[, 2])
Target Partner1 Partner2 Partner4 Gender
1 J9 A3 J9 <NA> M
2 <NA> T7 K5 L4 F
3 T7 T7 A3 J9 F
4 K5 J9 M4 L4 M
5 L4 M4 K5 A3 M
# Create lookup vector
lu_vect <- setNames(as.character(df2[["id"]]), df2[["name"]])
lu_vect
# Jim Mickey Andrew Taylor Lester Kurt
# "J9" "M4" "A3" "T7" "L4" "K5"
# Make a list of columns we want to *update*
cols_to_anonymise <- c("Target", "Partner1", "Partner2", "Partner4")
# Anonymise column by column, if name is not in key, replace by NA
df[cols_to_anonymise] <- lapply(
df[cols_to_anonymise],
function(x) lu_vect[as.character(x)]
)
# Print out results
df
# Target Gender Partner1 Partner2 Partner4
# 1 J9 M A3 J9 <NA>
# 2 <NA> F T7 K5 L4
# 3 T7 F T7 A3 J9
# 4 K5 M J9 M4 L4
# 5 L4 M M4 K5 A3
以R为基数的可能解决方案: 要替换的列名
colsR碱中的可能溶液: 要替换的列名 cols另一种碱性R溶液:
data.frame(apply(df[, -2], 2, function(x) as.character(df2$id)[match(x, as.character(df2$name))]),
Gender = df[, 2])
Target Partner1 Partner2 Partner4 Gender
1 J9 A3 J9 <NA> M
2 <NA> T7 K5 L4 F
3 T7 T7 A3 J9 F
4 K5 J9 M4 L4 M
5 L4 M4 K5 A3 M
# Create lookup vector
lu_vect <- setNames(as.character(df2[["id"]]), df2[["name"]])
lu_vect
# Jim Mickey Andrew Taylor Lester Kurt
# "J9" "M4" "A3" "T7" "L4" "K5"
# Make a list of columns we want to *update*
cols_to_anonymise <- c("Target", "Partner1", "Partner2", "Partner4")
# Anonymise column by column, if name is not in key, replace by NA
df[cols_to_anonymise] <- lapply(
df[cols_to_anonymise],
function(x) lu_vect[as.character(x)]
)
# Print out results
df
# Target Gender Partner1 Partner2 Partner4
# 1 J9 M A3 J9 <NA>
# 2 <NA> F T7 K5 L4
# 3 T7 F T7 A3 J9
# 4 K5 M J9 M4 L4
# 5 L4 M M4 K5 A3
另一个基本的R解决方案:
data.frame(apply(df[, -2], 2, function(x) as.character(df2$id)[match(x, as.character(df2$name))]),
Gender = df[, 2])
Target Partner1 Partner2 Partner4 Gender
1 J9 A3 J9 <NA> M
2 <NA> T7 K5 L4 F
3 T7 T7 A3 J9 F
4 K5 J9 M4 L4 M
5 L4 M4 K5 A3 M
# Create lookup vector
lu_vect <- setNames(as.character(df2[["id"]]), df2[["name"]])
lu_vect
# Jim Mickey Andrew Taylor Lester Kurt
# "J9" "M4" "A3" "T7" "L4" "K5"
# Make a list of columns we want to *update*
cols_to_anonymise <- c("Target", "Partner1", "Partner2", "Partner4")
# Anonymise column by column, if name is not in key, replace by NA
df[cols_to_anonymise] <- lapply(
df[cols_to_anonymise],
function(x) lu_vect[as.character(x)]
)
# Print out results
df
# Target Gender Partner1 Partner2 Partner4
# 1 J9 M A3 J9 <NA>
# 2 <NA> F T7 K5 L4
# 3 T7 F T7 A3 J9
# 4 K5 M J9 M4 L4
# 5 L4 M M4 K5 A3
对于base R,有没有办法使其他列不可变,这样我就不必重新附加未取消标识的性别列?我的真实示例中有数百列我想要保留,并且不希望在data.frame函数中选择每一列。对于base R,是否有办法使其他列不可变,这样我就不必重新附加未取消标识的性别列?我的真实示例中有数百列我想保留,我不想在data.frame函数中选择每一列,所以像cbind{columns I want}这样的东西然后对所有内容运行lappy?像cbind{columns I want}这样的东西然后对所有内容运行lappy?看起来很好!在cols_to_匿名部分中,我可以只选择一系列列名,如cTarget、Partner1:Partner4吗?我猜它看起来不会是这样的,但我很好奇,因为完整的示例有很多列可供选择,我宁愿从第一列和最后一列开始索引。还有,您在这里使用as.character函数有什么原因吗?只是好奇地选择列。也许startsWith或grep可以帮你?因子变量看起来很相似,但实际上与角色变量非常不同。看起来很好,效果也很好!在cols_to_匿名部分中,我可以只选择一系列列名,如cTarget、Partner1:Partner4吗?我猜它看起来不会是这样的,但我很好奇,因为完整的示例有很多列可供选择,我宁愿从第一列和最后一列开始索引。还有,您在这里使用as.character函数有什么原因吗?只是好奇地选择列。也许startsWith或grep可以帮你?因子变量看起来很相似,但实际上与字符变量非常不同。