在一个语句中重命名多个字段值

时间:2015-02-18 15:32:34

标签: r

我知道可以执行以下操作:

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

导致并非所有与案例定义匹配的值都被转换。

这样做的方法是什么?

3 个答案:

答案 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") )