[英]R: change one value every row in big dataframe
我刚开始使用R撰写硕士论文,直到现在我在这里阅读了很多问题和答案(这是很多试验和错误,但是没关系),我的所有计算才得以完成。 现在,我需要处理更复杂的代码,而我找不到解决方法。
就是这样:我有多个子数据集,其中包含很多条目,但是它们的结构都相同。 在其中一个(50000个条目)中,我只想每行更改一个值。 新值应为现有条目的数量加上“ ID”变量相同的另一个子数据集(140000个条目)的一些值。
由于这是第三天,我试图解决这个问题,我已经找到并测试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
我期望的输出是每行中的更新值“ VAL9”。
据我到目前为止的了解,您需要两件事:
除了@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
(更新。)
据我了解,您想创建一个新变量,该变量使用来自以相同ID
索引的两个不同数据集的信息。 最简单的方法可能是将数据集连接在一起(如果需要安全存储,只需连接所需的列)。 我发现dplyr
的join函数在这些情况下非常方便( 在此进行了详细说明)将数据集合并为一个后,应该很容易创建所需的新列。 例如: df$new <- df$old1 + df$old2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.