我知道可以执行以下操作:
df$V1[df$V1 == "Y"] <- 1
将任何等于“Y”的值重命名为 1。但是,如果我想要将等于“N”的值更改为 0,该怎么办?
我尝试过这样做:
df$V1[df$V1 == c("Y","N")] <- c(1,0)
但我收到警告
longer object is not a multiple of shorter object
这导致并非所有与大小写定义匹配的值都被转换。
有什么方法可以做到这一点?
最佳答案
这就是您的代码不起作用的原因
df$V1[df$V1 == c("Y","N")] <- c(1,0)
要求 R 匹配 V1 的值,其中它是“Y”和“N”的 2 个值的向量 如果你想得到“Y”或“N”,你可以这样做
df$V1[df$V1 %in% c("Y", "N")] <- c(1,0
就您而言,我可能会考虑使用 R 中的因子。因子是类别。因子中的级别就像向量的摘要,告诉您向量中有哪些唯一值/因子。函数levels(x)
为您提供向量 x
的级别
因此,如果您有一个如下所示的向量:x<-c('Male', 'Male','Male','Female','Female','Female')
你会看到它是由 2 个重复项组成 'Male', 'Female'
如果你运行levels(x)
你会得到
[1] Male Male Male Female Female Female
levels: Male Female
当你运行levels(x) <- c('M','F')
时
你会得到
[1] M M M F F F
levels: M F
例如,如果您有给定的以下数据框:
V1 <- rep(letters[1],10, letters[4],8) ## first column consist of 10 'a' and 8'd'
V2 <- 1:18
df <- data.frame(V1, V2)
levels(df$V1) <- c('A','D') # replace all 'a' with 'A' and all 'd' with 'D'
我认为这是柏拉图式的替换方式。
如果您只想替换特定值,我建议您编写一个像散列一样工作的函数,并应用于数据帧。
该技术在ggplot中用于替换facet_wrap http://www.cookbook-r.com/Graphs/Facets_(ggplot2)/中的标签
但这意味着您最终将编写更多代码行,尽管我认为它会看起来更好
关于在一条语句中重命名多个字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28587366/