我继承了一个数据集,该数据集为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更自然的方式做到这一点,我猜这将是适用的函数系列之一,但我可以&#39我完全绕过它 - 这是什么方法?
答案 0 :(得分:2)
以下是使用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
答案 1 :(得分:1)
将列名称旋转为itemX-NY
,然后让reshape
对其进行排序:
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