我知道可以执行以下操作:
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
导致并非所有与案例定义匹配的值都被转换。
这样做的方法是什么?
答案 0 :(得分:3)
这就是您的代码无效的原因
df$V1[df$V1 == c("Y","N")] <- c(1,0)
要求R匹配V1的值,其中它是2的值“Y”和“N”的向量 如果你想得到“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)/
但是这意味着你最终会编写更多代码行,尽管我认为它看起来会更好
答案 1 :(得分:1)
chartr
可能很有用:
x <- c("Y","N","N","X")
chartr("YN", "10", x)
#[1] "1" "0" "0" "X"
当然,这仅适用于只有一个字符的字符串。
答案 2 :(得分:0)
最好先编写可重现的代码。一个答案是:
df <- data.frame( V1 = c("Y","Y","N"))
df$V1 <- ifelse(df$V1 == "Y", 1, ifelse(df$V1 == "N", 0, "X") )