我正在进行数据挖掘课程,需要使用randomForest操纵一些数据来完成所需的任务。 V1,V2和V3是列名。如果V1 = A且V2 = 2,我希望R将“Eureka”输出到新列V4的相应行。我希望V4中的其他值设置为“NOPE”。实际数据集有300000行和6列。这可能看起来很奇怪,但如果我能学会如何做到这一点,我的问题就会得到解决。感谢。
V1 V2 V3
A 1 4
A 1 8
A 2 4
A 2 8
C 1 10
C 1 9
C 2 10
C 2 9
V1 V2 V3 V4
A 1 4 NOPE
A 1 8 NOPE
A 2 5 Eureka
A 2 3 Eureka
C 1 10 NOPE
C 1 8 NOPE
C 2 10 NOPE
C 2 4 NOPE
以下代码不起作用。
`for(g in 1:8){
if(data$V1[g]=="A"&data$V2[g]==2){
data$V4[g]=Eureka
}else{
data$V4[g]="NOPE"
}
}`
答案 0 :(得分:0)
我们可以使用数字索引或ifelse
来创建“V4”列。 V1=='A' & V2==2
给出了一个逻辑索引(TRUE/FALSE
)。添加1
,将逻辑向量强制转换为二进制(1/0
),并提供与2/1
对应的TRUE/FALSE
。此数值可用作索引,用“NOPE”/“Eureka”替换它。
df$V4 <- with(df, c('NOPE', 'Eureka')[(V1=='A' & V2==2)+1])
df
# V1 V2 V3 V4
#1 A 1 4 NOPE
#2 A 1 8 NOPE
#3 A 2 4 Eureka
#4 A 2 8 Eureka
#5 C 1 10 NOPE
#6 C 1 9 NOPE
#7 C 2 10 NOPE
#8 C 2 9 NOPE
或使用ifelse
df$V4 <- with(df, ifelse(V1=='A' & V2==2, 'Eureka', 'NOPE'))
另一种选择是data.table
。将“data.frame”转换为“data.table”(setDT
)。创建值为V4
的列(NOPE
)。满足条件(V1=='A' & V2==2
)的V4行被分配到Eureka
library(data.table)
setDT(df)[,V4:='NOPE'][V1=='A' & V2==2, V4:='Eureka'][]
关于代码中的错误,应引用“Eureka”。最好使用vectorized
方法而不是循环。
for(g in 1:8){
if(df$V1[g]=='A' & df$V2[g]==2){
df$V4[g] <- 'Eureka'
}
else{
df$V4[g] <- 'NOPE'
}
}
df$V4
#[1] "NOPE" "NOPE" "Eureka" "Eureka" "NOPE" "NOPE" "NOPE" "NOPE"
df <- structure(list(V1 = c("A", "A", "A", "A", "C", "C", "C", "C"),
V2 = c(1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L), V3 = c(4L, 8L, 4L,
8L, 10L, 9L, 10L, 9L)), .Names = c("V1", "V2", "V3"), class =
"data.frame", row.names = c(NA, -8L))
答案 1 :(得分:0)
将向量设置为默认值,然后使用逻辑索引将新值替换为正确的实例。
data$V4 <- "Nope"
data$V4[ data$V1[g]=="A" & data$V2[g]==2] <- "Eureka"