选择第一个观察到的数据并使用mutate

时间:2015-06-11 17:02:36

标签: r dplyr

我遇到了数据问题,我希望为每个ob取得第一个观察到的score得分id,然后从最后一次score中减去该得分help <- data.frame(id = c(5,5,5,5,5,12,12,12,17,17,20,20,20), ob = c(1,2,3,4,5,1,2,3,1,2,1,2,3), score = c(NA, 2, 3, 4, 3, 7, 3, 4, 3, 4, NA, 1, 4)) id ob score 1 5 1 NA 2 5 2 2 3 5 3 3 4 5 4 4 5 5 5 3 6 12 1 7 7 12 2 3 8 12 3 4 9 17 1 3 10 17 2 4 11 20 1 NA 12 20 2 1 13 20 3 4 }。

要求第一次观察减去最后一次观察的问题是有时缺少第一次观察数据。

无论如何要求为每个人提供第一个观察得分,从而跳过任何缺失的数据?

我构建了下面的df来说明我的问题。

   id ob score  es
1   5  1    NA  -1
2   5  2     2  -1
3   5  3     3  -1
4   5  4     4  -1
5   5  5     3  -1
6  12  1     7   3
7  12  2     3   3
8  12  3     4   3
9  17  1     3  -1
10 17  2     4  -1
11 20  1    NA  -3
12 20  2     1  -3
13 20  3     4  -3

我希望运行的代码是给我的代码......

es

我正在尝试使用dplyr并且我理解使用'group_by'命令,但是,不确定如何'选择'仅首先观察到的分数,然后变异以创建<div>

3 个答案:

答案 0 :(得分:6)

我会使用first()last()dplyr函数)和na.omit()(来自默认统计信息包。

首先,我会确保您的得分列是具有正确NA值的数字列(不是示例中的字符串)

help <- data.frame(id = c(5,5,5,5,5,12,12,12,17,17,20,20,20),
       ob = c(1,2,3,4,5,1,2,3,1,2,1,2,3),
       score = c(NA, 2, 3, 4, 3, 7, 3, 4, 3, 4, NA, 1, 4))

然后你可以做

library(dplyr)
help %>% group_by(id) %>% arrange(ob) %>% 
    mutate(es=first(na.omit(score)-last(na.omit(score))))

答案 1 :(得分:1)

//Assume Server 1
$conn = mysql_connect("127.0.0.1","root","");

//Assume Server 2
$conn1 = mysql_connect("127.0.0.1","root","");

//Server 1 database
mysql_select_db("db1",$conn);

//Server 2 database
mysql_select_db("db2",$conn1);

//Count number of rows from server 1 -> database -> table (tbl1)
$cnt_rw=mysql_query("select count(*) from db1.tbl1");
$cnt_n=mysql_fetch_array($cnt_rw);  

//Fetch and update row one by one
for($i=0;$i<($cnt_n['count(*)']);$i++)
{
    $one_row=mysql_query("select * from db1.tbl1 limit $i,1");
    while($one_val=mysql_fetch_array($one_row))
    {
        $one=$one_val['one'];
        $two=$one_val['two'];
        $three=$one_val['three'];
    }

    //Already exist means update else insert so am using replace query
    mysql_query("REPLACE INTO db2.tbl2(one,two,three)values('".$one."','".$two."','".$three."')");
    $one=$two=$three='';
}   

答案 2 :(得分:0)

这个解决方案有点冗长,只有b / c它依赖于几个辅助函数LAST# The position (indicator) of the first value that evaluates to TRUE. LAST <- function (x, none = NA) { out <- FIRST(reverse(x), none = none) if (identical(none, out)) { return(none) } else { return(length(x) - out + 1) } } # The position (indicator) of the last value that evaluates to TRUE. FIRST <- function (x, none = NA) { x[is.na(x)] <- FALSE if (any(x)) return(which.max(x)) else return(none) } # returns the difference between the first and last non-missing values diff2 <- function(x) x[LAST(!is.na(x))] - x[FIRST(!is.na(x))] library(dplyr) help %>% group_by(id) %>% arrange(ob) %>% summarise(diff = diff2(score))

{{1}}