R从列中的唯一值动态创建新列
R make new columns from uniqe values in column dynamically
我想根据一列中的唯一值动态创建新列。原文:
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)
}
我们可以应用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
您建议的代码无法工作,因为您正在使用 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)
}
我使用:
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
...
我想根据一列中的唯一值动态创建新列。原文:
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)
}
我们可以应用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
您建议的代码无法工作,因为您正在使用 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)
}
我使用:
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
...