我有一个数据框:
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"。有没有有效的方法来做到这一点?感谢。
答案 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))
我的方法显然只有效,因为组合很少。如果有更多的零和一个,则章程方法更加可行。只有四种可能的组合,这更具可读性。