如何在r中的数据帧中切换字符

时间:2016-10-28 16:13:18

标签: r

我有一个数据框:

ID        S01       S02       S03       S04       S05
M01       0|1       0|0       1|1       1|1       1|1
M02       0|0       0|0       0|0       1|1       1|0
M03       0|0       0|0       0|0       1|1       0|0
M04       0|1       0|1       0|1       0|0       0|1
M05       0|0       0|0       0|0       1|1       0|0

我想切换" 0"和" 1"彼此。结果是预期的:

ID        S01       S02       S03       S04       S05
M01       1|0       1|1       0|0       0|0       0|0
M02       1|1       1|1       1|1       0|0       0|1
M03       1|1       1|1       1|1       0|0       1|1
M04       1|0       1|0       1|0       1|1       1|0
M05       1|1       1|1       1|1       0|0       1|1

可以通过替换" 0"中间值,如" 2"或者其他什么,然后替换" 1"到" 0",并将中间值替换回" 1"。有没有有效的方法来做到这一点?感谢。

2 个答案:

答案 0 :(得分:7)

我们可以使用chartr将0替换为0,反之亦然。遍历列(lapply(df1[-1],)并使用chartr

更改字符
df1[-1] <- lapply(df1[-1], chartr, old = '01', new = '10')
df1
#   ID S01 S02 S03 S04 S05
#1 M01 1|0 1|1 0|0 0|0 0|0
#2 M02 1|1 1|1 1|1 0|0 0|1
#3 M03 1|1 1|1 1|1 0|0 1|1
#4 M04 1|0 1|0 1|0 1|1 1|0
#5 M05 1|1 1|1 1|1 0|0 1|1

数据

df1 <- structure(list(ID = c("M01", "M02", "M03", "M04", "M05"),
S01 = c("0|1", 
"0|0", "0|0", "0|1", "0|0"), S02 = c("0|0", "0|0", "0|0", "0|1", 
"0|0"), S03 = c("1|1", "0|0", "0|0", "0|1", "0|0"), S04 = c("1|1", 
"1|1", "1|1", "0|0", "1|1"), S05 = c("1|1", "1|0", "0|0", "0|1", 
"0|0")), .Names = c("ID", "S01", "S02", "S03", "S04", "S05"),
class = "data.frame", row.names = c(NA, -5L))

答案 1 :(得分:1)

switch = function(x){
    if(x == "0|0") return("1|1")
    if(x == "1|0") return("0|1")
    if(x == "0|1") return("1|0")
    if(x == "1|1") return("0|0")
    return(NA)
}

apply()(MARGIN = c(1,2),当然)这是您的数据框,它应该非常高效,易于阅读和理解每个人阅读您的代码。

编辑以发表评论: 鉴于来自akrun(非常优雅)答案的数据框df1,你可以简单地做到

apply(df1[,-1], 1:2, switch)

或者,保留ID列:

cbind(ID=df1[,1], apply(df1[,-1], 1:2, switch))

我的方法显然只有效,因为组合很少。如果有更多的零和一个,则章程方法更加可行。只有四种可能的组合,这更具可读性。