将值从行分配到同名的列

时间:2018-12-07 11:50:51

标签: r

我是R的新手,并且遇到以下问题: 我得到了数据帧df1

df1<-data.frame(name=c("C","C","C","B","B","A"),T=c(1,2,4,5,6,7),
                 A=c(0,2,3,2,3,0),B=c(1,0,2,0,0,5),C=c(0,0,0,2,0,1))

  name T A B C
1    C 1 0 1 0
2    C 2 2 0 0
3    C 4 3 2 0
4    B 5 2 0 2
5    B 6 3 0 0
6    A 7 0 5 1

我想将T列中的值重新分配给具有相应列名的列,如下所示:

  name  A B C
1    C  0 1 1
2    C  2 0 2
3    C  3 2 4
4    B  2 5 2
5    B  3 6 0
6    A  7 5 1

我尝试过:

df2<-df1[outer(L$names,colnames(df1), "==")]<- df$name
df2<-df1[cbind(1:nrow(df1), match( df1$names, colnames(df1)))] <-df$name

3 个答案:

答案 0 :(得分:3)

您的第二种方法真的很有效:

df2 <- df1
df2[cbind(1:nrow(df1), match(df1$name, colnames(df1)))] <- df2$T
df2$T <- NULL
df2
#   name A B C
# 1    C 0 1 1
# 2    C 2 0 2
# 3    C 3 2 4
# 4    B 2 5 2
# 5    B 3 6 0
# 6    A 7 5 1

此处df1[cbind(1:nrow(df1), match( df1$names, colnames(df1)))]为我们提供了df2的条目,需要用df2$T替换。

答案 1 :(得分:0)

我们可以使用mapply并并行发送值。

df2 <- data.frame(t(mapply(function(x, y, z) {
               df1[x, y] <- z
               df1[x,] },
               1:nrow(df1), df1$name, df1$T)))

df2
#  name T A B C
#1    C 1 0 1 1
#2    C 2 2 0 2
#3    C 4 3 2 4
#4    B 5 2 5 2
#5    B 6 3 6 0
#6    A 7 7 5 1

在这里,我们发送行号(1:nrow(df1)),列名(df1$name)和要更改的值(df1$T)以一次更新。

如果您不再需要T列,则可以将其删除

df2$T <- NULL

不是全局分配运算符(<<-)的忠实拥护者,但您也可以这样做

mapply(function(x, y, z) df1[x, y] <<- z, 1:nrow(df1), df1$name, df1$T)

这将产生相同的结果,而只需输入几个字符。

答案 2 :(得分:0)

如果您更喜欢使用tidyverse

df1 %>%
 rowid_to_column() %>% #Creating a row ID
 gather(var, val, -c(T, name, rowid)) %>% #Tranforming the data from wide to long format
 mutate(val = ifelse(var == name, T, val)) %>% #Using the values from column "T" in appropriate places
 spread(var, val) %>% #Trasnforming the data back to wide format
 select(-T, -rowid) #Removing the redundant variables

  name A B C
1    C 0 1 1
2    C 2 0 2
3    C 3 2 4
4    B 2 5 2
5    B 3 6 0
6    A 7 5 1