【发布时间】:2020-05-13 22:11:03
【问题描述】:
我经常收到使用多个标题和合并单元格格式化的数据(是的..excel)。通常,这些数据以表示样本站点的 2+ 个合并单元格的形式出现,位于代表该站点感兴趣参数的列中的许多观察值的顶部。我正在使用“openxlsx”包通过如下所示的 read.xlsx 函数读取数据(不会运行仅供参考):
read.xlsx('Mussels.xlsx',
detectDates = T,
sheet = 2,
fillMergedCells = T,
startRow = 2)
一个例子:我目前正在处理侵入性贻贝调查数据,其中我有 25 个长度,用于 14 个站点中的每个站点的两个物种,为了方便起见,我在此进行了缩写:
lendat <- data.frame(site.a = c("species.1",1,1,1,1),
site.a = c("species.2",2,2,2,2),
site.b = c("species.1",3,3,3,3),
site.b = c("species.2",4,4,4,4),
check.names = F)
我希望能够编写一些代码,将这些数据重新格式化为长格式,其中列名成为名为“site”的新列下的值,第一行数据成为其他列名,表示每个物种的长度如下:
data_form <- data.frame(site = c(rep("site.a", 4), rep("site.b",4)),
species.1 = c(1,1,1,1,3,3,3,3),
species.2 = c(2,2,2,2,4,4,4,4))
根据@Ronak Shah 的回答更新
将下面接受的答案中的代码与实际数据一起使用会导致没有数据的小标题。我发现当数据中引入十进制值(实际数据包含十进制值)时,过滤步骤会出现问题。我认为这是一个数据格式问题(示例数据都是因素),但即使这是真的,十进制数据也会更改为 NA。见例子:
lendat <- data.frame(site.a = c("species.1", 1.1,2.2,3,4),
site.a = c("species.2",5,6,7,8),
site.b = c("species.1", 9,10,11,12),
site.b = c("species.2",13,14,15,16),
check.names = F)
str(lendat)
'data.frame': 5 obs. of 4 variables:
$ site.a: Factor w/ 5 levels "1.1","2.2","3",..: 5 1 2 3 4
$ site.a: Factor w/ 5 levels "5","6","7","8",..: 5 1 2 3 4
$ site.b: Factor w/ 5 levels "10","11","12",..: 5 4 1 2 3
$ site.b: Factor w/ 5 levels "13","14","15",..: 5 1 2 3 4
我将管道代码逐行拆分
#Get data in long format
pivot_longer(junk, cols = everything(), names_to = 'site') %>%
#Create a new column with column names
mutate(col = paste0('species', .copy)) %>%
#Remove the values from the first row
filter(!grepl('\\D', value)) %>%
#Remove .copy column which was created
select(-.copy) %>%
#Group by the new column
group_by(col) %>%
#Add a row index
mutate(row = row_number()) %>%
#Get data in wide format
pivot_wider(names_from = col, values_from = value) %>%
#Remove row index
select(-row) %>%
#Arrange data according to site information
arrange(site)
x <- pivot_longer(junk, cols = everything(), names_to = 'site')
x
x <- mutate(x, col = paste0('species', .copy))
x
x <- filter(x, !grepl('\\D', value))
x
x <- select(.data = x, -.copy)
x
x <- group_by(x, col)
x
x <- mutate(x, row = row_number())
x
x <- pivot_wider(x, names_from = col, values_from = value)
x
x <- select(x, -row)
x
x <- arrange(x, site)
x
代码执行但将 NA 留在最后的 tibble 中。
【问题讨论】:
标签: r