【发布时间】:2013-04-18 11:47:17
【问题描述】:
原始数据框:
v1 = sample(letters[1:3], 10, replace=TRUE)
v2 = sample(letters[1:3], 10, replace=TRUE)
df = data.frame(v1,v2)
df
v1 v2
1公元前
2个
3 cc
4个
5 摄氏度
6 c b
7个
8 a b
9个
10个
新数据框:
new_df = data.frame(row.names=rownames(df))
for (i in colnames(df)) {
for (x in letters[1:3]) {
#new_df[x] = as.numeric(df[i] == x)
new_df[paste0(i, "_", x)] = as.numeric(df[i] == x)
}
}
v1_a v1_b v1_c v2_a v2_b v2_c
1 0 1 0 0 0 1
2 1 0 0 1 0 0
3 0 0 1 0 0 1
4 0 1 0 1 0 0
5 0 0 1 0 0 1
6 0 0 1 0 1 0
7 1 0 0 1 0 0
8 1 0 0 0 1 0
9 1 0 0 0 0 1
10 1 0 0 0 1 0
对于小型数据集,这很好,但对于更大的数据集,它会变得很慢。
有人知道不使用循环的方法吗?
【问题讨论】:
-
您的第一个数据框有两个变量,但看起来您只转换了第二个。你能澄清一下吗?
-
您正在覆盖您的数据。它的输出应该有 6 列。
-
对不起,这是我的错误——我在上面的代码中修复了它。在上面的示例中,每个原始列应该有三个新列。感谢您接听!
-
@Keith,你检查过已经发布的答案了吗?
-
@Arun 完成。有很多有用的解决方案。感谢大家的意见!