我有一个用户表,其中包含大约5个属性集(年龄,性别,家庭收入,职业,州)。对于每个属性,都有一个二进制赋值(即如果它们具有属性则为1,如果它们没有,则为0。
示例:
Index Female Male Age 18-34 Age 35-64 Age 65+
1 1 0 1 0 0
2 1 0 0 1 0
3 0 1 1 0 0
然后我利用交互功能为每个属性集创建一个交互变量,虽然它给出了正确的输出,但它并不理想:
公式:
data$GENDER <- with(data, interaction(data$Female, data$Male, sep=""))
输出:
Index Gender
1 10
2 10
3 01
理想情况下,我喜欢以下内容:
Index Gender
1 F
2 F
3 M
有没有一种简单的方法可以做到这一点而无需对每个交互变量值进行分类(即10 = F,01 = M)?
提前致谢,
斯图
答案 0 :(得分:3)
这是我编写的一个小函数,应该能够很好地处理这个函数,并在未选择类别或选择多个类别的实例中报告NA
值:
pickbin <- function(data) {
x <- NA
sel <- rowSums(data) == 1
x[sel] <- max.col(data,"first")[sel]
names(data)[x]
}
pickbin(dat[2:3])
#[1] "Female" "Female" "Male"
pickbin(dat[4:6])
#[1] "Age18_34" "Age35_64" "Age18_34"
dat
的位置:
dat <- read.table(text="
Index Female Male Age18_34 Age35_64 Age65
1 1 0 1 0 0
2 1 0 0 1 0
3 0 1 1 0 0",header=TRUE)
答案 1 :(得分:1)
我们也可以使用pmax
c("F", "M")[do.call(pmax, df1[2:3]*col(df1[2:3]))]
#[1] "F" "F" "M"
答案 2 :(得分:0)
尝试:
mydata<-read.table(header = T, text = "
Index Female Male Age_18-34 Age_35-64 Age_65+
1 1 0 1 0 0
2 1 0 0 1 0
3 0 1 1 0 0")
mydata$Gender<-with(mydata, ifelse(Female ==1, "F" ,ifelse(Male ==1, "M", NA)))
mydata
Index Female Male Age_18.34 Age_35.64 Age_65. Gender
1 1 0 1 0 0 F
2 1 0 0 1 0 F
3 0 1 1 0 0 M