通过条件在多个列之间交换值

3

I have a data frame like this:

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个回答

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

chartr函数使解决方案变得简单!谢谢 - user3354212

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接