尝试生成一个循环,用于对R中的连续列值求和
我试图生成一个循环函数,将一个表的连续列值相加,并将它们输出到另一个表中 例如,在我的原始表中,我们有a、b、c等列,它们包含相同数量的数值。 结果表应该是a、a+b、a+b+c等,直到原始表的最后一列 我有一种感觉,for循环对于这个操作应该足够了,但是我无法理解格式和语法尝试生成一个循环,用于对R中的连续列值求和,r,loops,for-loop,sum,nested-loops,R,Loops,For Loop,Sum,Nested Loops,我试图生成一个循环函数,将一个表的连续列值相加,并将它们输出到另一个表中 例如,在我的原始表中,我们有a、b、c等列,它们包含相同数量的数值。 结果表应该是a、a+b、a+b+c等,直到原始表的最后一列 我有一种感觉,for循环对于这个操作应该足够了,但是我无法理解格式和语法 任何帮助都将不胜感激 因为您是新来的,这里有一个非常小的可重复性示例 library(data.table) x = data.table(a=1:3,b=4:6,c=7:9) for(... now what? 下面是
任何帮助都将不胜感激 因为您是新来的,这里有一个非常小的可重复性示例
library(data.table)
x = data.table(a=1:3,b=4:6,c=7:9)
for(... now what?
下面是一种完成任务的方法:
library(data.table)
# make some dummy data
X = data.table(a=1:2,b=3:4,c=5:6)
# make an empty result table
Y = data.table()
# for i = 1 to the number of columns in X
for(i in 1:ncol(X)){
# colnames(X) is "a" "b" "c".
# colnames(X)[1:1] is "a", colnames(X)[1:2] is "a" "b", colnames(X)[1:3] is "a" "b" "c"
# paste0(colnames(X)[1:1],collapse='') is "a",
# paste0(colnames(X)[1:2],collapse='') is "ab",
# paste0(colnames(X)[1:3],collapse='') is "abc"
newcolname = paste0(colnames(X)[1:i],collapse='')
# Y[,(newcolname):= is data.table syntax to create a new column called newcolname
# X[,1:i] selects columns 1 to i
# rowSums calculates the, um, row sums :D
Y[,(newcolname):=rowSums(X[,1:i])]
}
因为你是新来的,这里有一个最小可复制的例子
library(data.table)
x = data.table(a=1:3,b=4:6,c=7:9)
for(... now what?
下面是一种完成任务的方法:
library(data.table)
# make some dummy data
X = data.table(a=1:2,b=3:4,c=5:6)
# make an empty result table
Y = data.table()
# for i = 1 to the number of columns in X
for(i in 1:ncol(X)){
# colnames(X) is "a" "b" "c".
# colnames(X)[1:1] is "a", colnames(X)[1:2] is "a" "b", colnames(X)[1:3] is "a" "b" "c"
# paste0(colnames(X)[1:1],collapse='') is "a",
# paste0(colnames(X)[1:2],collapse='') is "ab",
# paste0(colnames(X)[1:3],collapse='') is "abc"
newcolname = paste0(colnames(X)[1:i],collapse='')
# Y[,(newcolname):= is data.table syntax to create a new column called newcolname
# X[,1:i] selects columns 1 to i
# rowSums calculates the, um, row sums :D
Y[,(newcolname):=rowSums(X[,1:i])]
}
也许你需要像下面那样减少
cbind(
df,
setNames(
as.data.frame(Reduce(`+`, df, accumulate = TRUE)),
Reduce(paste0, names(df), accumulate = TRUE)
)
)
以致
a b c a ab abc
1 1 4 7 1 5 12
2 2 5 8 2 7 15
3 3 6 9 3 9 18
数据
df <- structure(list(a = 1:3, b = 4:6, c = 7:9), class = "data.frame", row.names = c(NA,
-3L))
df也许你需要Reduce
如下
cbind(
df,
setNames(
as.data.frame(Reduce(`+`, df, accumulate = TRUE)),
Reduce(paste0, names(df), accumulate = TRUE)
)
)
以致
a b c a ab abc
1 1 4 7 1 5 12
2 2 5 8 2 7 15
3 3 6 9 3 9 18
数据
df <- structure(list(a = 1:3, b = 4:6, c = 7:9), class = "data.frame", row.names = c(NA,
-3L))
df欢迎来到stack。这里的想法是给出一个最小的可重复示例(),以便其他人可以使用您的示例给出答案。如果你能给出你迄今为止尝试过的代码,我也会很感激的。嗨,很抱歉,我现在使用的代码是CoEig1=coeiframe[,1]CoEig2=coeiframe[,1]+coeiframe[,2]CoEig3=coeiframe[,1]+coeiframe[,2]+coeiframe[,3]dataFrame=cbind(CoEig1,CoEig2,CoEig3)coeifFrame是一个数值的数据帧,但是我想要的是一个for循环或者沿着这条线做这个函数的东西,而不是这个沉重的强制代码欢迎使用堆栈。这里的想法是给出一个最小的可重复示例(),以便其他人可以使用您的示例给出答案。如果你能给出你迄今为止尝试过的代码,我也会很感激的。嗨,很抱歉,我现在使用的代码是CoEig1=coeiframe[,1]CoEig2=coeiframe[,1]+coeiframe[,2]CoEig3=coeiframe[,1]+coeiframe[,2]+coeiframe[,3]dataFrame=cbind(CoEig1,CoEig2,CoEig3)coeifFrame是一个数值的数据帧,但是我想要的是一个for循环或者沿着这条线的某个东西来完成这个函数,而不是这个沉重的强制代码。嗨,我会为我的下一个查询做得更好!出现此错误消息,“行和中的错误(coeiframe[,1:i]):'x'必须是至少两个维度的数组”coeiframe只是我使用的一个数据帧,由3列数值组成,它没有列名,只有“1”、“2”、“3”您必须使用data.table才能使此代码工作,而不是data.frame。要将data.frame转换为data.table,请执行setDT(myData)
将myData就地转换为data.table。顺便说一句,不要做myData=setDT(myDate)
。嗨,我会为下一个查询做得更好!出现此错误消息,“行和中的错误(coeiframe[,1:i]):'x'必须是至少两个维度的数组”coeiframe只是我使用的一个数据帧,由3列数值组成,它没有列名,只有“1”、“2”、“3”您必须使用data.table才能使此代码工作,而不是data.frame。要将data.frame转换为data.table,请执行setDT(myData)
将myData就地转换为data.table。顺便说一句,不要做myData=setDT(myDate)
。