这是我的第一篇帖子,而且我对R还比较陌生,所以如果我写得不好,很抱歉.
我在其他任何地方都没有发现这个问题,但最初的方法与下面描述的方法有些类似:
How to mutate several columns by column index rather than column name using across?.
我有一个包含时间序列数据的数据框,我想要从一系列连续列中删除特定列.在下面的示例中,1R中的值将从列1A、1B和1C中删除.同样,2R中的值将从2A、2B和2C中删除.
所以像这样的数据帧
t | 1A | 1B| 1C|1RMV| 2A | 2B| 2C|2RMV|
- | - -|- -|- -| - -| - -|- -|- -|- - |
1 | 1 | 4 | 7 | 3 | 1 | 4 | 7 | 1 | . . . . . . .
2 | 2 | 5 | 8 | 2 | 2 | 5 | 8 | 2 |
3 | 3 | 6 | 9 | 1 | 3 | 6 | 9 | 3 |
会变成这样
t | 1A | 1B| 1C|1RMV| 2A | 2B| 2C|2RMV|
-| - -|- -|- -| - -| - -|- -|- -|- - |
1 | -2 | 1 | 4 | 3 | 0 | 3 | 6 | 1 | . . . . . . .
2 | 0 | 3 | 6 | 2 | 0 | 3 | 6 | 2 |
3 | 2 | 5 | 8 | 1 | 0 | 3 | 6 | 3 |
我之前已经‘手动’地执行了这个操作,它运行得很好,然而,自从试图使这个过程更自动化以来,我遇到了一些问题.
由于每组(1A、1B、1C,而2A、2B、2C、2D、2E等)中的列数不同,我最初创建了一个列表,其中包含我想要从其他列中减go 的所有列的索引位置,如下所示:
#Return TRUE only for columns to be removed
df_boolean <- str_ends(colnames(df), "RMV")
#Create a 1D vector with elements of index positions of columns to be removed in Data
col_number <- ncol(Intensity_Raw_Data)
remove_indices <- c()
for(i in 1:col_number){
if(df_boolean[i] == TRUE){
remove_indices <- c(background_indices, i)
}
}
然后,我使用cross from dplyr执行减法,如下所示:
group_number <- length(remove_indices)
#Calculate subtraction for first group, probably way to do it in one loop but first column is the time column and I'm lazy
df_Subtracted <- df %>%
mutate(across(2:(remove_indices[1] - 1), ~. - df[(remove_indices[1])]))
#Calculate subtracction for remaining groups
for(i in 2:group_number){
df_Subtracted <- df_Subtracted %>%
mutate(across((remove_indices[i-1] + 1):(remove_indices[i] - 1), ~.x - df[(remove_indices[i])]))
在这里我遇到了我的问题,当手动运行此程序时(即手动在cross()中键入列名),列名保持不变.但是,当我使用上面的代码运行它时,列名被重命名为:
1A$1R 1B$1R 1C$1R.-不,不,不-不,不,不-不,不,不2A$2R 2B$2R 2C$2R 2D$2R.-不,不,不-不,不,不-不,不,不-不,不,不-不,不,不
虽然使用str()显示View()中的输出看起来是正确的,但结果显示输出中的每一列(Df_Subtracted)实际上是一个1变量数据框.
我不确定是什么原因导致了这种情况的发生,但我认为这可能与我如何对要删除的列进行索引有关.如有任何帮助,我们将不胜感激!
**
- UPDATE个
**
我略微修改了GuedesBF anwser,使用了Akrun in this post中使用的方法,为除以列名的数据创建了一个通用的anwser.
df_subtracted_split <- df %>%
split.default(sub('\\d+', '', names(df))) %>%
lapply(function(x) {names(x)[ncol(x)] <- "RMV";x}) %>%
map(~mutate(.x, across(1:last_col(1), ~.x - RMV)))
df_subtracted <- do.call(qpcR:::cbind.na, Data_Final)
For some reason list_rbind/list_cbind resulted in dropping off
columns, I read here that it is probably a result of some groups in my data frame having missing rows, thus I used cbind.na
from qpcR
instead.
感谢GuedesBF和Peter861222!