简体   繁体   English

在R data.frame中将单元格向左移动

[英]Shift cells to left in R data.frame

I have data in Excel that comes from an application that summarizes that data into different tables. 我在Excel中有来自应用程序的数据,该数据将数据汇总到不同的表中。 The data looks good in Excel, but when I try to import it into R some columns are skipped and not aligned. 数据在Excel中看起来不错,但是当我尝试将其导入R时,某些列被跳过并且未对齐。 I need to tidy up the data so that I can plot it. 我需要整理数据,以便对其进行绘图。

Below is a reproducible sample. 以下是可复制的示例。

df <- data.frame( ` `  =  c("cars","buses","","under 1yr","1-2 yrs","2-5 yrs",">5 yrs"),
              fcltA =  c("1","5","","","","","" ),
              ` `  =  c("","","fcltA","5","","","1"),
              fcltB =  c("6","","","","","",""),
              ` `  =  c("","","fcltB","3","","2","1"),
              fcltC =  c("2","2","","","","",""),
              ` ` =  c("","","fcltC","1","2","","1"),
 check.names = FALSE, fix.empty.names = FALSE)

Below is what I want 以下是我想要的

dfClnd <- data.frame( ` `  =  c("cars","buses","","under 1yr","1-2 yrs","2-5 yrs",">5 yrs"),
                  fcltA =  c("1","5"," fcltA","5","","","1" ),
                  fcltB =  c("3","3","fcltB","3","","2","1"), 
                  fcltC =  c("2","2","fcltC","1","2","","1"),
                  check.names = FALSE, fix.empty.names = FALSE)

I found this question but it does not work well for my problem because it shifts some values to the incorrect columns. 我找到了这个问题,但由于它会将一些值移到不正确的列上,因此不适用于我的问题。

Below is a sample of how the data looks like: 以下是数据外观的示例:

在此处输入图片说明

A solution using and . 使用解决方案。 Notice that when creating df I set stringsAsFactors = FALSE to avoid creating factor columns. 请注意,创建df我将stringsAsFactors = FALSE设置为避免创建因子列。 This is because the coalesce function will not work on different factor levels. 这是因为coalesce功能在不同的因子级别上将不起作用。 df3 is the final output. df3是最终输出。

library(dplyr)
library(purrr)

# Replace "" with NA
df[df == ""] <- NA

# Get the new column names    
NewCol <- names(df)
NewCol <- NewCol[!NewCol %in% " "]

# Conduct the merge of columns
df2 <- map_dfc(NewCol, function(x){
  df_temp <- df[which(names(df) %in% x) + c(0, 1)]
  df_out <- as_data_frame(coalesce(df_temp[, 1], df_temp[, 2])) %>%
    setNames(x)
  return(df_out)
})

# Merge the first column with the new data frame
# Replace NA with ""
df3 <- bind_cols(df[, 1, drop = FALSE], df2)
df3[is.na(df3)] <- ""
df3
#             fcltA fcltB fcltC
# 1      cars     1     6     2
# 2     buses     5           2
# 3           fcltA fcltB fcltC
# 4 under 1yr     5     3     1
# 5   1-2 yrs                 2
# 6   2-5 yrs           2      
# 7    >5 yrs     1     1     1

DATA 数据

df <- data.frame( ` `  =  c("cars","buses","","under 1yr","1-2 yrs","2-5 yrs",">5 yrs"),
                  fcltA =  c("1","5","","","","","" ),
                  ` `  =  c("","","fcltA","5","","","1"),
                  fcltB =  c("6","","","","","",""),
                  ` `  =  c("","","fcltB","3","","2","1"),
                  fcltC =  c("2","2","","","","",""),
                  ` ` =  c("","","fcltC","1","2","","1"),
                  check.names = FALSE, fix.empty.names = FALSE,
                  stringsAsFactors = FALSE)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM