R:在大数据帧中每行更改一个值

时间:2016-09-09 09:50:54

标签: r

我刚刚开始与R合作完成我的硕士论文,到目前为止我的所有计算都得到了解决,因为我在这里阅读了很多问题和答案(而且它有很多试验和错误,但没关系)。 现在我需要处理更复杂的代码,我无法找到实现此目的的方法。

多数情况:我有多个具有大量条目的子数据集,但它们都以相同的方式构建。在其中一个(50000个条目)中,我想每行只更改一个值。新值应该是现有条目的数量加上来自另一个子数据集(140000个条目)的几个值,其中' ID'变量是相同的。

由于这是我尝试解决这个问题的第三天,我已经找到并测试了forapply,但两者都运行了几个小时(三小时后取消)。 以下是我尝试之一的示例(使用for):

for (i in 1:50000) {
  Entry_ID <- Sub02[i,4] 
  SUM_Entries <- sum(Sub03$Source==Entry_ID) 
  Entries_w_ID <- subset(Sub03, grepl(Entry_ID, Sub03$Source)) # The Entry_ID/Source is a character

  Value1 <- as.numeric(Entries_w_ID$VAL1) 
  SUM_Value1 <- sum(Value1)
  Value2 <- as.numeric(Entries_w_ID$VAL2)
  SUM_Value2 <- sum(Value2)

  OLD_Val1 <- Sub02[i,13]
  OLD_Val <- as.numeric(OLD_Val1)
  NEW_Val <- SUM_Entries + SUM_Value1 + SUM_Value2 + OLD_Val

  Sub02[i,13] <- NEW_Val

}

我知道这可能是一个愚蠢的代码,但这就是我作为初学者尝试它的方式。如果有人能帮我解决这个问题,我会非常感激,所以我可以和我的论文相处。 谢谢!

以下是我的数据结构示例:

        Text VAL0 Source ID VAL1 VAL2 VAL3 VAL4 VAL5 VAL6 VAL7 VAL8 VAL9
XXX 12 456335667806925_1075080942599058 10153901516433434_10153902087098434 4 1 0 0 4 9 4 6 8
ABC 8 456335667806925_1057045047735981 10153677787178434_10153677793613434 6 7 1 1 5 3 6 8 11
DEF 8 456747267806925_2357045047735981 45653677787178434_94153677793613434 5 8 2 1 5 4 1 1 9

我期望的输出是更新值&#39; VAL9&#39;在每一行。

2 个答案:

答案 0 :(得分:2)

据我所知,到目前为止,你需要做两件事:

  1. 总结一个数据集中的一些值
  2. 使用ID变量
  3. 将它们添加到另一个数据集

    除了@yoland已经贡献的东西,我建议在两个单独的任务中分解它。考虑这两个数据集:

    a = data.frame(x = 1:2, id = letters[1:2], stringsAsFactors = FALSE)
    a
    #   x id
    # 1 1  a
    # 2 2  b
    
    b = data.frame(values = as.character(1:4), otherid = letters[1:2], 
                   stringsAsFactors = FALSE)
    sapply(b, class)
    #      values     otherid 
    # "character" "character"
    

    现在值为character,我们需要将其转换为numeric

    b$values = as.numeric(b$values)
    sapply(b, class)
    #    values     otherid 
    # "numeric" "character"
    

    然后总结b中的值(按otherid分组):

    library(dplyr)
    
    b = group_by(b, otherid)
    b = summarise(b, sum_values = sum(values))
    b
    #   otherid sum_values
    #     <chr>      <dbl>
    # 1       a          4
    # 2       b          6
    

    然后将其加入a - 请注意,标识符已在c()中指定:

    ab = left_join(a, b, by = c("id" = "otherid"))
    ab
    #   x id sum_values
    # 1 1  a          4
    # 2 2  b          6
    

    然后,我们可以将b之和的结果添加到x中的变量a

    ab$total = ab$x + ab$sum_values
    ab
    #   x id sum_values total
    # 1 1  a          4     5
    # 2 2  b          6     8
    

    (更新)。

答案 1 :(得分:0)

根据我的理解,您希望创建一个新变量,该变量使用来自同一ID索引的两个不同数据集的信息。最简单的方法是将数据集连接在一起(如果需要安全内存,只需加入所需的列)。我发现dplyr的连接函数对于这些情况非常方便(整齐地解释here)一旦将数据集合并为一个,就可以轻松创建所需的新列。例如:df$new <- df$old1 + df$old2