如何对数据框中的列进行排序,以使一行中所有相同的字符串都位于同一列中

时间:2019-10-28 14:22:29

标签: r sorting dataframe

我有63列和1697行的非常大的数据框。行的末尾充满了NA,但我希望将行中的匹配值放在同一列中,并将NA留在空白处

有点像这样(更新):

v1 <- c("v1","v1","v1","v1","v1","v1","v1")
v2 <- c("v3","v2","v2","NA","v2","v2","v2")
v3 <- c("v4","v4","v3","NA","v3","v3", "v3")
v4 <- c("v5","v5","v4","NA","v5","v4","NA")
v5 <- c("NA","NA","v5","NA","v6","v6", "NA")
v6 <- c("NA","NA","v6","NA","v7","v7","NA")
v7 < - c("NA","NA","NA","NA","NA","NA","NA")
df <- data.frame(v1,v2,v3,v4,v5,v6,v7)

df

  v1 v2 v3 v4 v5 v6 v7
1 v1 v3 v4 v5 NA NA NA
2 v1 v2 v4 v5 NA NA NA
3 v1 v2 v3 v4 v5 v6 NA
4 v1 NA NA NA NA NA NA
5 v1 v2 v3 v5 v6 v7 NA
6 v1 v2 v3 v4 v6 v7 NA
7 v1 v2 v3 NA NA NA NA

但是我希望一切都这样对齐:

  v1 v2 v3 v4 v5 v6 v7
1 v1 NA NA v4 v5 NA NA
2 v1 v2 NA v4 v5 NA NA
3 v1 v2 v3 v4 v5 v6 NA
4 v1 NA NA NA NA NA NA
5 v1 v2 v3 NA v5 v6 v7 
6 v1 v2 v3 v4 NA v6 v7 
7 v1 v2 v3 NA NA NA NA

我已经尝试过map.values(),但是没有像ifelse()那样出现,但这都需要我输入特定的单元格数据并进行更改。

列名确实与单元格名称匹配。

我想使用数据放入一个不在场的情节中,所以我想我可以

for (i in 1:63){
gsub("NA", 0, df[,i]}

,然后对于包含“ v”的任何内容都具有相同的二进制值,以表示存在或不存在二进制数1或0,但是必须对齐

没有预定义的规则来管理数据,数据框已经与许多其他.csv文件整合在一起,这是目前我可以理解的最佳格式。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

更新后的答案以匹配新的输入数据

数据

我从NA中删除了引号:

v1 <- c("v1","v1","v1","v1","v1","v1","v1")
v2 <- c("v3","v2","v2",NA,"v2","v2","v2")
v3 <- c("v4","v4","v3",NA,"v3","v3", "v3")
v4 <- c("v5","v5","v4",NA,"v5","v4",NA)
v5 <- c(NA,NA,"v5",NA,"v6","v6", NA)
v6 <- c(NA,NA,"v6",NA,"v7","v7",NA)
v7 <- c(NA,NA,NA,NA,NA,NA,NA)
df <- data.frame(v1,v2,v3,v4,v5,v6,v7, stringsAsFactors = F)

代码

l <- list()
u <- c("v1", "v2", "v3", "v4", "v5", "v6", "v7")
h <- NULL
for(k in 1:nrow(df)){
  # create a list for each row of the df
  l[[k]] <- df[k, ]
  for(i in 1:length(l[[k]])){
    #check if number exists in the row
    if(u[i] %in% l[[k]]){
      # find the index of the number given it exists
      a <- which(l[[k]] == u[i])
      #assign to "help" vector in order to not overwrite values 
      h[i] <- l[[k]][a]
    }
    else{
      #numbers that do not exist in the vector are asigned NA
      h[i] <- NA
    }
  }
  #replace row by sorted vector with NA place holders ("help" vector)
  l[[k]] <- h
}

结果

df1 <- as.data.frame(do.call(rbind, l))
df1
  V1 V2 V3 V4 V5 V6 V7
1 v1 NA v3 v4 v5 NA NA
2 v1 v2 NA v4 v5 NA NA
3 v1 v2 v3 v4 v5 v6 NA
4 v1 NA NA NA NA NA NA
5 v1 v2 v3 NA v5 v6 v7
6 v1 v2 v3 v4 NA v6 v7
7 v1 v2 v3 NA NA NA NA