如何使用列名替换某些值

时间:2018-05-08 14:00:59

标签: r

我在R

中有一张下表
df <- data.frame('a' = c(1,0,0,1,0),
                 'b' = c(1,0,0,1,0),
                 'c' = c(1,1,0,1,1))
df
   a  b  c
1  1  1  1
2  0  0  1
3  0  0  0
4  1  1  1
4  0  0  1

我想要的是每当行等于1时用行名替换行值。输出将是这一个:

   a  b  c
1  a  b  c
2  0  0  c
3  0  0  0
4  a  b  c
4  0  0  c

我怎样才能在R中这样做?感谢。

5 个答案:

答案 0 :(得分:6)

我会使用Mapreplace

df[] <- Map(function(n, x) replace(x, x == 1, n), names(df), df)
df
#   a b c
# 1 a b c
# 2 0 0 c
# 3 0 0 0
# 4 a b c
# 5 0 0 c

答案 1 :(得分:4)

我们可以使用

df[] <- names(df)[(NA^!df) * col(df)]
df[is.na(df)] <- 0
df
#  a b c
#1 a b c
#2 0 0 c
#3 0 0 0
#4 a b c
#4 0 0 c

答案 2 :(得分:2)

您可以尝试stackunstack

a=stack(df)
a
   values ind
1       1   a
2       0   a
3       0   a
4       1   a
5       0   a
6       1   b
7       0   b
8       0   b
9       1   b
10      0   b
11      1   c
12      1   c
13      0   c
14      1   c
15      1   c
a$values[a$values==1]=as.character(a$ind)[a$values==1]
unstack(a)
  a b c
1 a b c
2 0 0 c
3 0 0 0
4 a b c
5 0 0 c

答案 3 :(得分:2)

我们可以尝试迭代数据框的名称,然后处理每个列,以获得基本R选项:

df <- data.frame(a=c(1,0,0,1,0), b=c(1,0,0,1,0), c=c(1,1,0,1,1))

df <-  data.frame(sapply(names(df), function(x) {
    y <- df[[x]]
    y[y == 1] <- x
    return(y)
}))

df

  a b c
1 a b c
2 0 0 c
3 0 0 0
4 a b c
5 0 0 c

Demo

答案 4 :(得分:1)

您可以使用ifelse执行此操作,但您必须进行一些中间转置以考虑R的列主要订单处理。

data.frame(t(ifelse(t(df)==1,names(df),0)))
  a b c
1 a b c
2 0 0 c
3 0 0 0
4 a b c
5 0 0 c