繁体   English   中英

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

[英]R: change one value every row in big dataframe

我刚开始使用R撰写硕士论文,直到现在我在这里阅读了很多问题和答案(这是很多试验和错误,但是没关系),我的所有计算才得以完成。 现在,我需要处理更复杂的代码,而我找不到解决方法。

就是这样:我有多个子数据集,其中包含很多条目,但是它们的结构都相同。 在其中一个(50000个条目)中,我只想每行更改一个值。 新值应为现有条目的数量加上“ ID”变量相同的另一个子数据集(140000个条目)的一些值。

由于这是第三天,我试图解决这个问题,我已经找到并测试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

我期望的输出是每行中的更新值“ VAL9”。

据我到目前为止的了解,您需要两件事:

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

除了@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的变量xa

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

(更新。)

据我了解,您想创建一个新变量,该变量使用来自以相同ID索引的两个不同数据集的信息。 最简单的方法可能是将数据集连接在一起(如果需要安全存储,只需连接所需的列)。 我发现dplyr的join函数在这些情况下非常方便( 在此进行了详细说明)将数据集合并为一个后,应该很容易创建所需的新列。 例如: df$new <- df$old1 + df$old2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM