我是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
答案 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