我想知道你是否善良的人能回答我的问题。在我在下面提供的样本数据中,在第1列中,我有一个分类变量,在第2列中有p值。
x <- c(rep("A",0.1*10000),rep("B",0.2*10000),rep("C",0.65*10000),rep("D",0.05*10000))
categorical_data=as.matrix(sample(x,10000))
p_val=as.matrix(runif(10000,0,1))
combi=as.data.frame(cbind(categorical_data,p_val))
head(combi)
V1 V2
1 A 0.484525170875713
2 C 0.48046557046473
3 C 0.228440979029983
4 B 0.216991128632799
5 C 0.521497668232769
6 D 0.358560319757089
我现在想要使用其中一个分类变量,假设是“C”,如果是C,则创建另一个变量(第3列中打印1,如果不是则打印0)。
combi$NEWVAR[combi$V1=="C"] <-1
combi$NEWVAR[combi$V1!="C" <-0
V1 V2 NEWVAR
1 A 0.484525170875713 0
2 C 0.48046557046473 1
3 C 0.228440979029983 1
4 B 0.216991128632799 0
5 C 0.521497668232769 1
6 D 0.358560319757089 0
我想对V1中的每个变量执行此操作,然后使用lapply进行循环:
variables=unique(combi$V1)
loopeddata=lapply(variables,function(x){
combi$NEWVAR[combi$V1==x] <-1
combi$NEWVAR[combi$V1!=x]<-0
}
)
我的输出看起来像这样:
[[1]]
[1] 0
[[2]]
[1] 0
[[3]]
[1] 0
[[4]]
[1] 0
我想要的输出类似于第二个代码块中的表,但是当在第三列上循环时,A = 1,而B,C,D = 0。然后B = 1,A,C,D = 0等。
如果有人能帮助我,我将非常感激。
答案 0 :(得分:4)
这样的事情怎么样:
model.matrix(~ -1 + V1, data=combi)
如果您愿意,可以cbind
combi
:
combi <- cbind(combi, model.matrix(~ -1 + V1, data=combi))
答案 1 :(得分:1)
model.matrix
绝对是在R中执行此操作的方法。但是,您也可以考虑使用table
。
以下是使用我在使用set.seed(1)
时得到的结果的示例(在与随机数据共享示例问题时始终使用种子)。
LoopedData <- table(sequence(nrow(combi)), combi$V1)
head(LoopedData)
#
# A B C D
# 1 0 1 0 0
# 2 0 0 1 0
# 3 0 0 1 0
# 4 0 0 1 0
# 5 0 1 0 0
# 6 0 0 1 0
## If you want to bind it back with the original data
combi <- cbind(combi, as.data.frame.matrix(LoopedData))
head(combi)
# V1 V2 A B C D
# 1 B 0.0647124934475869 0 1 0 0
# 2 C 0.676612401846796 0 0 1 0
# 3 C 0.735371692571789 0 0 1 0
# 4 C 0.111299667274579 0 0 1 0
# 5 B 0.0466546178795397 0 1 0 0
# 6 C 0.130910312291235 0 0 1 0