使用extract()将数据帧的格式从宽改为长
我正在尝试使用extract()在我的测量值旁边添加一个“Error”列。但是,我想我对regex和/或extract()语法有些厌倦了。如果你能帮忙,我将不胜感激 理想情况下,我应该使用列的长格式使用extract()将数据帧的格式从宽改为长,r,regex,reshape2,tidyverse,R,Regex,Reshape2,Tidyverse,我正在尝试使用extract()在我的测量值旁边添加一个“Error”列。但是,我想我对regex和/或extract()语法有些厌倦了。如果你能帮忙,我将不胜感激 理想情况下,我应该使用列的长格式 Reading Category Measurement Error Sample 可复制代码 Reading <- c(1,2,3,4) Cat1 <- runif(4)*10 Cat1_err <- runif(4)/10 Cat2 <- runif(4)*10 Cat
Reading Category Measurement Error Sample
可复制代码
Reading <- c(1,2,3,4)
Cat1 <- runif(4)*10
Cat1_err <- runif(4)/10
Cat2 <- runif(4)*10
Cat2_err <- runif(4)/10
Cat3 <- runif(4)*10
Cat3_err <- runif(4)/10
Sample <- c("X14","X23","X11","X10")
df_wide <- data.frame(Reading,Cat1,Cat1_err,Cat2,Cat2_err,Cat3,Cat3_err,Sample)
df_wide
Reading Cat1 Cat1_err Cat2 Cat2_err Cat3 Cat3_err Sample
1 1 7.375116 0.01014747 2.234376 0.08978868 5.373709 0.02245759 X14
2 2 5.097937 0.07036843 5.691806 0.05561866 1.823026 0.07658357 X23
3 3 2.034116 0.01689391 8.192971 0.03844054 4.242167 0.01036751 X11
4 4 9.129536 0.09130868 5.908125 0.05505775 5.747843 0.05774527 X10
df_long <- df_wide %>%
+ gather(key=Category, value=Measurement, Cat1:Cat3_err, factor_key = TRUE) %>%
+ extract(Measurement,c("Meas","Error"),"Cat\d_err", remove=FALSE)
Error in names(l) <- enc2utf8(into) :
'names' attribute [2] must be the same length as the vector [0]
阅读我认为您不想使用摘录
。我认为,separate
和spread
可能是您想要的。以下内容将生成警告消息,但有效
library(tidyverse)
df_long <- df_wide %>%
gather(key=Category, value=Measurement, Cat1:Cat3_err, factor_key = TRUE) %>%
separate(Category, into = c("Category", "Type")) %>%
mutate(Type = ifelse(is.na(Type), "Measurement", "Error")) %>%
spread(Type, Measurement) %>%
select(Reading, Category, Measurement, Error, Sample)
df_long
Reading Category Measurement Error Sample
1 1 Cat1 0.8453114 0.074961215 X14
2 1 Cat2 4.5962112 0.059012908 X14
3 1 Cat3 5.4100838 0.076049726 X14
4 2 Cat1 4.5956145 0.016215603 X23
5 2 Cat2 1.7768868 0.040258838 X23
6 2 Cat3 1.9597101 0.027356213 X23
7 3 Cat1 1.6204584 0.057760820 X11
8 3 Cat2 4.9478913 0.054855327 X11
9 3 Cat3 2.9670444 0.004276482 X11
10 4 Cat1 0.1831593 0.038415489 X10
11 4 Cat2 2.5716471 0.024932980 X10
12 4 Cat3 8.5517659 0.015378512 X10
库(tidyverse)
df_long%
聚集(键=类别,值=度量,Cat1:Cat3\u错误,因子\u键=真)%>%
单独(类别,分为=c(“类别”,“类型”))%>%
变异(Type=ifelse(is.na(Type),“测量”,“错误”))%>%
排列(类型、测量)%>%
选择(读数、类别、测量、误差、样本)
德福朗
阅读类别测量误差样本
1 1 Cat1 0.8453114 0.074961215 X14
2 1 Cat2 4.5962112 0.059012908 X14
3 1 Cat3 5.4100838 0.076049726 X14
4 2 Cat1 4.5956145 0.016215603 X23
5 2 Cat2 1.7768868 0.040258838 X23
6 2 Cat3 1.9597101 0.027356213 X23
7 3 Cat1 1.6204584 0.057760820 X11
8 3 Cat2 4.9478913 0.054855327 X11
9 3 Cat3 2.9670444 0.004276482 X11
10 4 Cat1 0.1831593 0.038415489 X10
11 4 Cat2 2.5716471 0.024932980 X10
12 4 Cat3 8.5517659 0.015378512 X10
我认为您不想使用提取。我认为,separate
和spread
可能是您想要的。以下内容将生成警告消息,但有效
library(tidyverse)
df_long <- df_wide %>%
gather(key=Category, value=Measurement, Cat1:Cat3_err, factor_key = TRUE) %>%
separate(Category, into = c("Category", "Type")) %>%
mutate(Type = ifelse(is.na(Type), "Measurement", "Error")) %>%
spread(Type, Measurement) %>%
select(Reading, Category, Measurement, Error, Sample)
df_long
Reading Category Measurement Error Sample
1 1 Cat1 0.8453114 0.074961215 X14
2 1 Cat2 4.5962112 0.059012908 X14
3 1 Cat3 5.4100838 0.076049726 X14
4 2 Cat1 4.5956145 0.016215603 X23
5 2 Cat2 1.7768868 0.040258838 X23
6 2 Cat3 1.9597101 0.027356213 X23
7 3 Cat1 1.6204584 0.057760820 X11
8 3 Cat2 4.9478913 0.054855327 X11
9 3 Cat3 2.9670444 0.004276482 X11
10 4 Cat1 0.1831593 0.038415489 X10
11 4 Cat2 2.5716471 0.024932980 X10
12 4 Cat3 8.5517659 0.015378512 X10
库(tidyverse)
df_long%
聚集(键=类别,值=度量,Cat1:Cat3\u错误,因子\u键=真)%>%
单独(类别,分为=c(“类别”,“类型”))%>%
变异(Type=ifelse(is.na(Type),“测量”,“错误”))%>%
排列(类型、测量)%>%
选择(读数、类别、测量、误差、样本)
德福朗
阅读类别测量误差样本
1 1 Cat1 0.8453114 0.074961215 X14
2 1 Cat2 4.5962112 0.059012908 X14
3 1 Cat3 5.4100838 0.076049726 X14
4 2 Cat1 4.5956145 0.016215603 X23
5 2 Cat2 1.7768868 0.040258838 X23
6 2 Cat3 1.9597101 0.027356213 X23
7 3 Cat1 1.6204584 0.057760820 X11
8 3 Cat2 4.9478913 0.054855327 X11
9 3 Cat3 2.9670444 0.004276482 X11
10 4 Cat1 0.1831593 0.038415489 X10
11 4 Cat2 2.5716471 0.024932980 X10
12 4 Cat3 8.5517659 0.015378512 X10
也许有一种更快的方法可以做到这一点,但它似乎满足了您的需求:
df_wide %>%
gather(key=Category, value=Measurement, Cat1:Cat3_err, factor_key = TRUE) %>%
extract(Category,c("Meas","Error"),"(Cat\\d)[_]*([a-z]*)") %>%
spread(key = Error, value = Measurement)
请注意,除其他事项外,R中的正则表达式需要使用\\d
。可能有一种更快的方法来实现这一点,但它似乎满足了您的要求:
df_wide %>%
gather(key=Category, value=Measurement, Cat1:Cat3_err, factor_key = TRUE) %>%
extract(Category,c("Meas","Error"),"(Cat\\d)[_]*([a-z]*)") %>%
spread(key = Error, value = Measurement)
注意,除其他事项外,R中的正则表达式需要使用\\d
。此错误很容易修复:将反斜杠加倍,\\d
。但是,它无法修复整个解决方案。此错误很容易修复:将反斜杠加倍,\\d
。但是,它不能解决整个问题。我要离开了。使用您的解决方案,我得到了…警告消息:12个位置的值太少:1、2、3、4、9、10、11、12、17、18、19、20知道这意味着什么吗?@val这意味着并非所有行都有模式“uz”,因此为这些行创建了NA
。警告信息不应该影响你想做的事情。我正要离开。使用您的解决方案,我得到了…警告消息:12个位置的值太少:1、2、3、4、9、10、11、12、17、18、19、20知道这意味着什么吗?@val这意味着并非所有行都有模式“uz”,因此为这些行创建了NA
。警告消息不应影响您要执行的操作。