我刚刚开始与R合作完成我的硕士论文,到目前为止我的所有计算都得到了解决,因为我在这里阅读了很多问题和答案(而且它有很多试验和错误,但没关系)。 现在我需要处理更复杂的代码,我无法找到实现此目的的方法。
多数情况:我有多个具有大量条目的子数据集,但它们都以相同的方式构建。在其中一个(50000个条目)中,我想每行只更改一个值。新值应该是现有条目的数量加上来自另一个子数据集(140000个条目)的几个值,其中' ID'变量是相同的。
由于这是我尝试解决这个问题的第三天,我已经找到并测试了for
和apply
,但两者都运行了几个小时(三小时后取消)。
以下是我尝试之一的示例(使用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;在每一行。
答案 0 :(得分:2)
据我所知,到目前为止,你需要做两件事:
除了@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