您好,并提前感谢您的帮助,
(请注意注释部分以获得更多见解:即下面示例中的成本列已添加到此问题中; Simon提供了一个很好的答案,但成本列本身未在他的数据响应中表示,尽管他提供的功能与成本列一起使用)
我有一个数据集,让我们称之为"数据",看起来像这样
NAME DATE COLOR PAID COST
Jim 1/1/2013 GREEN 150 100
Jim 1/2/2013 GREEN 50 25
Joe 1/1/2013 GREEN 200 150
Joe 1/2/2013 GREEN 25 10
Run Code Online (Sandbox Code Playgroud)
我想要做的是将具有相同NAME值的记录的PAID(和COST)元素相加,并将行数(如本示例中所示)减少为2,这样我的新数据框如下所示:
NAME DATE COLOR PAID COST
Jim 1/2/2013 GREEN 200 125
Joe 1/2/2013 GREEN 225 160
Run Code Online (Sandbox Code Playgroud)
就日期而言,我并不关心哪一个在求和过程中幸存下来.
我已经达到了rowSums(数据),但我不确定如何使用它.任何帮助将不胜感激.
考虑一下数组a
:
> a <- array(c(1:9, 1:9), c(3,3,2))
> a
, , 1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
, , 2
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
Run Code Online (Sandbox Code Playgroud)
我们如何有效地计算由第三维索引的矩阵的行和,使得结果为:
[,1] [,2]
[1,] 12 12
[2,] 15 15
[3,] 18 18
Run Code Online (Sandbox Code Playgroud)
??
通过以下'dims'
参数可以轻松实现列总和colSums()
:
> colSums(a, dims = 1)
Run Code Online (Sandbox Code Playgroud)
但我不能找到一种方法,使用rowSums()
阵列上,以达到预期的效果,因为它有一个不同的解读'dims'
到的colSums()
.
使用以下方法计算所需的行总和很简单:
> apply(a, …
Run Code Online (Sandbox Code Playgroud) 我需要扩展这个问题,它根据第二个数组的索引对数组的值求和.让A
是结果数组,B
是索引数组,并且C
要被总计在阵列.然后A[i] = sum
过C
这样index(B) == i
.
相反,我的设置是
N = 5
M = 2
A = np.zeros((M,N))
B = np.random.randint(M, size=N) # contains indices for A
C = np.random.rand(N,N)
Run Code Online (Sandbox Code Playgroud)
我需要 A[i,j] = sum_{k in 0...N} C[j,k]
这样的C[k] == i
,即以B匹配i的索引为条件的rowum.有没有一种有效的方法来做到这一点?对于我的应用程序,N大约为10,000,M大约为20.在最小化问题中每次迭代都会调用此操作...我当前的循环方法非常慢.
谢谢!
我是R的新手,我试图根据他们的名字按组加总.我有一个像这样的数据框:
DT <- data.frame(a011=c(0,10,20,0),a012=c(010,10,0,0),a013=c(10,30,0,10),
a021=c(10,20,20,10),a022=c(0,0,0,10),a023=c(20,0,0,0),a031=c(30,0,10,0),
a032=c(0,0,10,0),a033=c(20,0,0,0))
Run Code Online (Sandbox Code Playgroud)
我想获得以"a01"开头的所有列的总和,以"a02"开头的所有列以及以"a03"开头的所有列:
a01tot a02tot a03tot
20 30 50
50 20 0
20 20 20
10 20 0
Run Code Online (Sandbox Code Playgroud)
到目前为止我已经习惯了
DT$a01tot <- rowSums(DT[,grep("a01", names(DT))])
Run Code Online (Sandbox Code Playgroud)
等等,但我的真实数据框有更多的组,我想避免为每个组编写一行代码.我想知道是否可以在矢量或列表中包含"a01","a02","a03"......并且有一些内容可以添加"a01tot","a02tot","a03tot"......数据框自动.
我知道我的问题与这个问题非常相似:不同组列的R总和,以相似的字符串开头,但解决方案指出,
cbind(df, t(rowsum(t(df), sub("_.*", "_t", names(df)))))
Run Code Online (Sandbox Code Playgroud)
在我的情况下不起作用,因为没有要替换的公共元素(如"_")(我无法将变量的名称更改为a01_1,a02_2等).
在我的情况下,切换到"长"格式也不是一个可行的解决方案.
任何帮助将不胜感激.
我有一个非常棘手的问题,我似乎无法解决.
我有一个大型数据集(23277行,151列).每列的值均为0:100(含),表示为世界事件分配的概率.
作为计算每个人得分的一部分,我需要计算数据集中每个值的出现次数.
我首先尝试申请,但我需要忽略NA和子集,所以当我尝试以下内容时:
apply(ans.samp, 1, sum(ans.samp[ans==0]), na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)
我收到了错误消息:sum(ans.samp [ans == 0])'不是函数,字符或符号
我用sapply,vapply,tapply和do.call重复这个过程无济于事.
放弃了矢量化解决方案,我写了以下for循环.
RespCount <- function (x) { for (i in (1:nrow(x)))
{ res <- vector(mode="numeric", length=nrow(x))
ans.tmp <- x[i,]
res[i] <- length(ans.tmp[ans.tmp==0])
print(res)
}
return(res)
}
Run Code Online (Sandbox Code Playgroud)
然而,在我使用它之后,它只返回样本中O的总和.
我会感激一些帮助,因为我在一段时间的压力下,我希望将来能够在R中解决这些问题.
包含的样本数据用于再现性:
structure(list(X = 1:6, X100 = c(70L, NA, 80L, 0L, 40L, NA),
X10 = c(30L, NA, NA, NA, NA, NA), X1 = c(50L, NA, NA, NA,
NA, NA), X11 = c(50L, NA, NA, NA, NA, NA), X12 = c(30L, NA, …
Run Code Online (Sandbox Code Playgroud) 我对R很陌生,这是我第一次敢在这里问一个问题.
我正在使用具有Likert标度的数据集,并且我希望在不同的列组中对它们进行行和,这些列共享其名称中的第一个字符串.
下面我构建了一个只有2行的数据框来说明我遵循的方法,尽管我希望得到关于如何编写更有效的方法的反馈.
df <- as.data.frame(rbind(rep(sample(1:5),4),rep(sample(1:5),4)))
var.names <- c("emp_1","emp_2","emp_3","emp_4","sat_1","sat_2"
,"sat_3","res_1","res_2","res_3","res_4","com_1",
"com_2","com_3","com_4","com_5","cap_1","cap_2",
"cap_3","cap_4")
names(df) <- var.names
Run Code Online (Sandbox Code Playgroud)
所以,我所做的是使用grep函数,以便能够将以某些字符串开头的指定变量的行相加并将它们存储在一个新变量中.但我必须为每个变量编写一行新代码.
df$emp_t <- rowSums(df[, grep("\\bemp.", names(df))])
df$sat_t <- rowSums(df[, grep("\\bsat.", names(df))])
df$res_t <- rowSums(df[, grep("\\bres.", names(df))])
df$com_t <- rowSums(df[, grep("\\bcom.", names(df))])
df$cap_t <- rowSums(df[, grep("\\bcap.", names(df))])
Run Code Online (Sandbox Code Playgroud)
但是数据集中有很多变量,我想知道是否只有一行代码可以实现这一点.例如,某种方法将以相同字符串开头的变量分组在一起,然后应用行函数.
提前致谢!
我有一个连续年份(列)的独特个体(行)的值数据框架。这里提供了一个虚拟数据示例:
dt = structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), `2015` = c(0,
0.8219178, 0, 0.1369863, 0, 1.369863, 0.2739726, 0.8219178, 5,
0), `2016` = c(0, 1.369863, 0, 0.2739726, 0, 0.2739726, 0, 3.2876712,
0, 0), `2017` = c(0.6849315, 0, 0, 0.6849315, 0, 0.5479452, 0,
0, 0, 0), `2018` = c(1.0958904, 0.5479452, 1.9178082, 0, 0, 0,
0, 0, 0, 3), `2019` = c(0, 0, 0, 1.0958904, 0, 0.9589041, 0.5479452,
0, 0, 0), `2020` = c(0.4383562, 0, 0, …
Run Code Online (Sandbox Code Playgroud) ID <- 1:6
math <- c("YES","NO","YES","NO",NA,NA)
history <- c(NA,NA,"NO","NO","YES",NA)
dt <- data.frame(ID, math, history)
ID math history
1 1 YES <NA>
2 2 NO <NA>
3 3 YES NO
4 4 NO NO
5 5 <NA> YES
6 6 <NA> <NA>
Run Code Online (Sandbox Code Playgroud)
我想添加一个附加列(“pass”),如下所示
如果学生至少说过一次“是”:“是”(无论其他科目是否缺少数据等等。)
如果学生没有回答“是”
所以,列会像这样:(我可以使用这个最小的示例手动执行此操作,但不能使用我的真实数据)
> dt
ID math history pass
1 1 YES <NA> YES
2 2 NO <NA> NO
3 3 YES NO YES
4 4 NO NO NO
5 5 <NA> YES YES
6 6 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个总计列,以将前面各列的值相加。但是,如果有NA,我将遇到困难。如果该行中没有NA,则我的脚本将不会计算总和。
我如何编辑以下脚本以将NA实质上计数为0,或者完全忽略它们,但仍计算总和。我实际上不想将NA更改为0。
CTDB %>% mutate(SCARED_TOTAL_CHILD = CTDB %>% rowwise() %>%
SELECT(SCARED_BREATHE_CHILD:SCARED_SHY_CHILD) %>% rowSums()) -> CTDB
Run Code Online (Sandbox Code Playgroud)
谢谢!!