按条件跨多个列交换值

时间:2015-12-11 15:55:50

标签: 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/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

,我想交换0和1之间的字符

预期结果:

 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

2 个答案:

答案 0 :(得分:5)

这是使用lapply工作的一种方法:

#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)
})

输出:

> 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

答案 1 :(得分:0)

未使用lapply

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