R 按条件在多列之间交换值
我有这样一个数据框:R 按条件在多列之间交换值,r,R,我有这样一个数据框: df = read.table(text="IDX D1 D2 D3 D4 D5 D6 D7 F 0/0 1/1 0/0 0/1 1/1 0/0 0/0 F 1/1 0/0 0/0 0/0 0/0 1/1 0/0 T 0/0 0/0 0/0 0/0 0
df = read.table(text="IDX D1 D2 D3 D4 D5 D6 D7
F 0/0 1/1 0/0 0/1 1/1 0/0 0/0
F 1/1 0/0 0/0 0/0 0/0 1/1 0/0
T 0/0 0/0 0/0 0/0 0/0 0/0 0/0
T 0/1 0/1 0/0 1/1 0/1 0/0 0/1
F 1/1 0/1 1/1 0/0 0/1 0/0 0/0", header=T, stringsAsFactors=F)
如果df$IDX==F
预期结果:
IDX D1 D2 D3 D4 D5 D6 D7
F 1/1 0/0 1/1 1/0 0/0 1/1 1/1
F 0/0 1/1 1/1 1/1 1/1 0/0 1/1
T 0/0 0/0 0/0 0/0 0/0 0/0 0/0
T 0/1 0/1 0/0 1/1 0/1 0/0 0/1
F 0/0 1/0 0/0 1/1 1/0 1/1 1/1
这是使用
lappy
的一种方法:
#subsetting the df to just replace the elements we need
df[df$IDX==FALSE, -1] <- lapply(df[df$IDX==FALSE, -1], function(x) {
#chartr is translates specific characters to different ones
#here it converts 0s -> 1s and vice versa
chartr("01", "10", x)
})
不使用
lappy
df[df$IDX==FALSE, -1] <- chartr("01", "10", as.matrix(df[df$IDX==FALSE, -1]))
df
# IDX D1 D2 D3 D4 D5 D6 D7
# 1 FALSE 1/1 0/0 1/1 1/0 0/0 1/1 1/1
# 2 FALSE 0/0 1/1 1/1 1/1 1/1 0/0 1/1
# 3 TRUE 0/0 0/0 0/0 0/0 0/0 0/0 0/0
# 4 TRUE 0/1 0/1 0/0 1/1 0/1 0/0 0/1
# 5 FALSE 0/0 1/0 0/0 1/1 1/0 1/1 1/1
df[df$IDX==FALSE,-1]chartr函数使解决方案变得简单!谢谢
df[df$IDX==FALSE, -1] <- chartr("01", "10", as.matrix(df[df$IDX==FALSE, -1]))
df
# IDX D1 D2 D3 D4 D5 D6 D7
# 1 FALSE 1/1 0/0 1/1 1/0 0/0 1/1 1/1
# 2 FALSE 0/0 1/1 1/1 1/1 1/1 0/0 1/1
# 3 TRUE 0/0 0/0 0/0 0/0 0/0 0/0 0/0
# 4 TRUE 0/1 0/1 0/0 1/1 0/1 0/0 0/1
# 5 FALSE 0/0 1/0 0/0 1/1 1/0 1/1 1/1