如何基于另一个表[R或Python]对一个表中的多个列重新编码?
我的数据框有几个列,其中包含我想重新编码为整数的字符串值。共有20多列,每列都有其唯一的键值对,而且并非所有列都需要重新编码,因此我正在寻找一种方法来避免在任何时候写20多个case_,每个case_在3-6个case之间,这就是我目前阅读的3+个答案所建议的 我在另一个表中有字符串-整数对,我想知道是否有一种方法可以遍历数据列和键值对的行,重新编码字符串,如下所示: 数据: 键值对:如何基于另一个表[R或Python]对一个表中的多个列重新编码?,python,r,pandas,dplyr,Python,R,Pandas,Dplyr,我的数据框有几个列,其中包含我想重新编码为整数的字符串值。共有20多列,每列都有其唯一的键值对,而且并非所有列都需要重新编码,因此我正在寻找一种方法来避免在任何时候写20多个case_,每个case_在3-6个case之间,这就是我目前阅读的3+个答案所建议的 我在另一个表中有字符串-整数对,我想知道是否有一种方法可以遍历数据列和键值对的行,重新编码字符串,如下所示: 数据: 键值对: Column_name String Int C2 D 5 C2
Column_name String Int
C2 D 5
C2 E 10
C2 F 0
C3 X 1
C3 Y 2
C3 Z 7
输出:
C1 C2 C3
A 5 1
B 10 2
C 0 7
换句话说,对于每个数据列C,代码将只查看C的键值行,并用它们的值替换字符串
我对R或Python解决方案持开放态度。这里有一种方法可以帮助您解决问题
在带有merge和rehsape2的R中
创建字典的另一种方法
d = {}
for c, s, i in zip(*map(pairs.get, pairs)):
d.setdefault(c, {})[s] = i
df.replace(d)
C1 C2 C3
0 A 5 1
1 B 10 2
2 C 0 7
有了R,我们就可以使用命名向量来完成这项工作,而无需在基R中使用任何包
df1[-1] <- Map(function(x, y) y[x], df1[-1],
with(df2, split(setNames(Int, String), Column_name)))
df1
# C1 C2 C3
#1 A 5 1
#2 B 10 2
#3 C 0 7
此外,如果列是有序的,那么这将更加紧凑
df1[-1] <- with(df2, setNames(Int, String))[as.matrix(df1[-1])]
没有任何空格,节省空间
df1[-1]<-with(df2,setNames(Int,String))[as.matrix(df1[-1])]
注意:这可以缩放到任意数量的列
数据
使用dplyr left_join:
图书馆弹琴
图书馆三年
数据%>%
gatherColumn\u名称,字符串,-C1%>%
左键\u VAL%>%
选择字符串%>%
扩展列名称,Int
输出
C1 C2 C3
1 A 5 1
2 B 10 2
3C07
可以通过从“聚集”中排除更多变量来缩放此方法。例如,使用以下数据帧:
数据“字符串”中的值可能在不同的“列名称”组中重复。使用这个df.replace{k:dictzipd.String,d.Int代表k,d成对使用。groupby'Column_name'}@piRSquared-yep,注意这一点,只需更新:-,谢谢你,这在两种语言中都非常快!您,先生或女士,简直让我大吃一惊。@Khashir-yw:-快乐编码这种方法可以扩展到任意数量的列,而不是所有的列都需要重新编码吗?@Khashir-yes,如果您在初始聚集中包含这些列,我相信是这样。@Khashir我在回答中添加了一个示例,其中一些变量没有重新编码。没有一个现成的解决方案可能与实际数据有关;但这一次的逻辑帮助我找到了解决办法。因此,我选择了这个作为答案。哇,太简洁了。这会扩展到任意数量的列吗?不是所有列都需要重新编码吗?是的。它告诉replace仅替换字典指定的列。注意WeNYoBen的回答也一样。
df1[-1] <- Map(function(x, y) y[x], df1[-1],
with(df2, split(setNames(Int, String), Column_name)))
df1
# C1 C2 C3
#1 A 5 1
#2 B 10 2
#3 C 0 7
df1[-1] <- with(df2, setNames(Int, String))[as.matrix(df1[-1])]
df1[-1]<-with(df2,setNames(Int,String))[as.matrix(df1[-1])]
df1 <- structure(list(C1 = c("A", "B", "C"), C2 = c("D", "E", "F"),
C3 = c("X", "Y", "Z")), class = "data.frame", row.names = c(NA,
-3L))
df2 <- structure(list(Column_name = c("C2", "C2", "C2", "C3", "C3",
"C3"), String = c("D", "E", "F", "X", "Y", "Z"), Int = c(5L,
10L, 0L, 1L, 2L, 7L)), class = "data.frame", row.names = c(NA,
-6L))