2017-03-20 32 views
2

我已经以下列格式获得的结果:劈裂成列2和由数替换字符 - R的

 Parameter Wert 
... 
99  se.m 0.1000 
100  se.m 0.1000 
101 se.st 0.5000 
102 se.st 0.500 
... 

欲列Parameter分为两列:ParameterInsentität。拆分应该在点.所在的位置完成。然后在结果列Intensität中,我想用2的值替换所有m,并将所有st替换为值3。结果应该是这样的:

Parameter Intensität Wert 
... 
99 se  2 0.4000 
100 se  2 0.0396 
101 se  3 0.2702 
102 se  3 1.1566 
... 

我已成功地获得这种格式,但我相信有一个更优雅的方式做。

我得到结果的方式很笨拙。我原本在输出中有2列:se.mse.st。我手动更改了列名:

colnames(results) <- c("2", "3") 

然后将两列合并为1列。然后我在每一行都添加了一个包含字符se的列。

results <- melt(results) 
cbind(Parameter ="se", results) 

我知道还有另外一种情况。例如,通过使用tidyr中的extract,但我无法获得表达式语法的权利。也stringr包,我可以使用str_ match函数或也可能strsplit。所有这些看起来不错,但我似乎无法将它们应用于我的问题。我被困在这里。有类似的问题,但我找不到适合我的解决方案。 PS:我喜欢任何输入 - 评论,批评,提示。我是一名学习者,任何建议对我都有很大的价值。

+0

检查[Rpubs ](https://rpubs.com/bradleyboehmke/data_wrangling)用于dplyr&tidyr的数据处理。我问这个问题后发现它。 – Danka

回答

2

我们可以使用separate

library(tidyr) 
library(dplyr) 
separate(df1, Parameter, into = c("Parameter", "Intensitat")) %>% 
       mutate(Intensitat = recode(Intensitat, m = 2, st = 3)) 

# Parameter Intensitat Wert 
#1  se   2 0.1 
#2  se   2 0.1 
#3  se   3 0.5 
#4  se   3 0.5 

或者,我们可以单独通过指定sep使用read.table,做一个transform通货膨胀和cbind与 “WERT” 列

cbind(transform(read.table(text= as.character(df1$Parameter), 
    col.names = c("Parameter", "Intensitat"), sep="."), 
     Intensitat = ifelse(Intensitat=="m", 2, 3)), df1["Wert"]) 
# Parameter Intensitat Wert 
#99   se   2 0.1 
#100  se   2 0.1 
#101  se   3 0.5 
#102  se   3 0.5 
+1

谢谢@akrun,这正是我一直在寻找的! – Danka

+1

我刚刚在[Rpubs](https://rpubs.com/bradleyboehmke/data_wrangling)上阅读了关于管道运算符'%>%'的知识,这会将我引向'separete'等其他函数。虽然我会把它放在这里,但可能适用于其他有类似问题的学生 – Danka

+0

@Danka是的,在整套包装中有许多有用的功能 – akrun