[英]Restructuring data using apply family of functions
我繼承了一個數據集,該數據集是針對13個名稱中的每個名稱測量的23個屬性(受試者之間-每個參與者在所有這些屬性上僅對一個名稱評分)。 現在,它的結構使得屬性是移動最快的因素,后跟名稱。 因此數據如下所示:
Sub# N1-item1 N1-item2 N1-item3 […] N2-item1 N2-item2 N2-item3
1 3 5 3 NA NA NA
2 NA NA NA 1 5 3
3 3 5 3 NA NA NA
4 NA NA NA 2 2 1
需要對其進行重組,以使其折疊在名稱上,並且所有item1條目都位於同一列(主題與此無關),如下所示(請記住,有23個項目不是3和13名稱不是2):
Name item1 item2 item3
N1 3 5 3
N2 1 5 3
我可以使用循環來做到這一點,但是我寧願以一種對R更自然的方式來做,我猜這將是應用函數家族之一,但是我無法完全理解它- -什么是聰明的方法?
這是使用dplyr
和tidyr
的答案:
library(dplyr)#loads libraries
library(tidyr)
dat %>% #name of your dataframe
gather(key, val, -Sub) %>% #gathers to long data, with id as Sub
filter(!is.na(val)) %>% #removes rows with NA for the value
separate(key, c("Name", "item")) %>% #split the column key into Name and item
spread(item, val) #spreads the data into wide format, with item as the columns
Sub Name item1 item2 item3
1 1 N1 3 5 3
2 2 N2 1 5 3
3 3 N1 3 5 3
4 4 N2 2 2 1
將列名旋轉為itemX-NY
,然后reshape
itemX-NY
以將itemX-NY
排序:
names(dat)[-1] <- gsub("(^.+?)-(.+?$)", "\\2-\\1", names(dat)[-1])
na.omit(reshape(dat, direction="long", idvar="Sub", varying=-1, sep="-"))
# Sub time item1 item2 item3
#1.N1 1 N1 3 5 3
#3.N1 3 N1 3 5 3
#2.N2 2 N2 1 5 3
#4.N2 4 N2 2 2 1
數據在哪里:
dat <- structure(list(Sub = 1:4, `item1-N1` = c(3L, NA, 3L, NA), `item2-N1` = c(5L,
NA, 5L, NA), `item3-N1` = c(3L, NA, 3L, NA), `item1-N2` = c(NA,
1L, NA, 2L), `item2-N2` = c(NA, 5L, NA, 2L), `item3-N2` = c(NA,
3L, NA, 1L)), .Names = c("Sub", "item1-N1", "item2-N1", "item3-N1",
"item1-N2", "item2-N2", "item3-N2"), row.names = c(NA, -4L), class = "data.frame
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.