我想动态地在一列中基于唯一值创建新列。原文:
id, category
1, a
2, b
3, c
4, b
新:
id, category, a, b, c
1, a, 1, 0, 0
2, b, 0, 1, 0
3, c, 0, 0, 1
4, b, 0, 1, 0
现在我做:
data$categoryA = ifelse(data$category=="a", 1, 0)
data$categoryB = ifelse(data$category=="b", 1, 0)
...
但我想动态地做这样的事情:
for(CATEGORY in unique(data$category) {
data$CATEGORY = ifelse(data$CATEGORY =="a", 1, 0)
}
答案 0 :(得分:1)
我们可以应用table
,将原始数据集转换为data.frame
和cbind
。
cbind(df1, as.data.frame.matrix(table(df1)))
# id category a b c
#1 1 a 1 0 0
#2 2 b 0 1 0
#3 3 c 0 0 1
#4 4 b 0 1 0
答案 1 :(得分:0)
您提议的代码无法使用,因为您使用data$VARIABLE
在数据框中创建新变量:
for(CATEGORY in unique(data$category) {
data$CATEGORY = ifelse(data$CATEGORY =="a", 1, 0)
}
如果使用
,这可能会按预期工作for(CATEGORY in unique(data$category) {
data[[CATEGORY]] = ifelse(data$CATEGORY =="a", 1, 0)
}
答案 2 :(得分:0)
我用:
factor2binary=function(inputvar)
{
set.l <- unique(inputvar)
x=(sapply(set.l, function(x) as.numeric( inputvar == x)))
colnames(x)=unique(inputvar)
x
}
A=sample(LETTERS[1:4],100,rep=T
factor2binary(A)
D A C B
[1,] 1 0 0 0
[2,] 1 0 0 0
[3,] 0 1 0 0
[4,] 1 0 0 0
[5,] 0 0 1 0
[6,] 0 1 0 0
...