当前位置: 首页 > 知识库问答 >
问题:

从数据帧中的每个分组行中减去第一年的值

松钊
2023-03-14

我需要这个社区的R专家的帮助:set。种子(1234)x

我想得到这个输出:

id value1 value2 year
 1     9     -3    2
 1     1      0    3
 1     2     -1    4
 2    -2      2    2
 2    -3      2    3
 2     6      0    4
 3    -1      0    2
 3     3      0    3
 4     5      0    2
 5     2      1    2

谢谢你的帮助!

共有2个答案

唐烨煜
2023-03-14

考虑by(按因子子集数据帧的函数),并让它调用subset(过滤掉第1年)和中的(重新计算列)。从那里,by返回一个数据帧列表,您可以通过wtihdo.call(rbind,…)完全绑定这些数据帧。

数据

txt = 'id value1 value2 year
1      1      4    1
1     10      1    2
1      2      4    3
1      3      3    4
2      4      1    1
2      2      3    2
2      1      3    3
2     10      1    4
3      4      5    1
3      3      5    2
3      7      5    3
4      4      2    1
4      9      2    2
5      5      3    1
5      7      4    2'

df1 <- read.table(text=txt, header=TRUE)

过程

df_list <- by(df1, df1$id, function(sub){      
  subset(
         within(sub, {        
             value1 <- value1 - value1[[1]] 
             value2 <- value2 - value2[[1]]           
         }), 
         year > 1
  )      
})

new_df <- data.frame(do.call(rbind, unname(df_list)),
                     row.names = NULL)    
new_df

#    id value1 value2 year
# 1   1      9     -3    2
# 2   1      1      0    3
# 3   1      2     -1    4
# 4   2     -2      2    2
# 5   2     -3      2    3
# 6   2      6      0    4
# 7   3     -1      0    2
# 8   3      3      0    3
# 9   4      5      0    2
# 10  5      2      1    2

谭卜鹰
2023-03-14

按“id”分组后,使用mutate_at计算值之间的差异,其中“value”列上的“year”为1,然后过滤out行中的“year”为1

library(dplyr)
df1 %>% 
   group_by(id) %>%
   mutate_at(vars(value1:value2), funs(. -.[year == 1])) %>% 
   filter(year!= 1)
# A tibble: 10 x 4
# Groups:   id [5]
#      id value1 value2  year
#   <int>  <int>  <int> <int>
# 1     1      9     -3     2
# 2     1      1      0     3
# 3     1      2     -1     4
# 4     2     -2      2     2
# 5     2     -3      2     3
# 6     2      6      0     4
# 7     3     -1      0     2
# 8     3      3      0     3
# 9     4      5      0     2
#10     5      2      1     2

或者具有< code>data.table的类似逻辑

library(data.table)
setDT(df1)[, (2:3) := lapply(.SD, function(x) x - x[year == 1]),
      by = id, .SDcols = value1:value2][year != 1]

基数R中,我们可以做

nm1 <- c('value1', 'value2')
df1[nm1] <- df1[nm1] -df1[df1$year==1, 
        nm1][rep(seq_along(unique(df1$id)), table(df1$id)),]
df1[df1$year != 1,]
df1 <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
  3L, 4L, 4L, 5L, 5L), value1 = c(1L, 10L, 2L, 3L, 4L, 2L, 1L, 
 10L, 4L, 3L, 7L, 4L, 9L, 5L, 7L), value2 = c(4L, 1L, 4L, 3L, 
 1L, 3L, 3L, 1L, 5L, 5L, 5L, 2L, 2L, 3L, 4L), year = c(1L, 2L, 
  3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 1L, 2L, 1L, 2L)), class =
   "data.frame", row.names = c(NA, -15L))
 类似资料:
  • 我有两个数据帧,我们称它们为A和B。它们有完全相同的7列(我们称它们为col1、col2、col3、col4、col5、col6和col7)。有些栏目包括客户id、客户名、客户姓、电话号码等(出于保密目的,我无法透露确切的姓名)。 DataFrame A比DataFrame B大得多,DataFrame B中的一些条目包含在DataFrame A中(即DataFrame A)。DataFrame

  • 我有一个熊猫,如下所示: 我想按进行分组并获取每个组的第一行: 预期成果: 我尝试了下面的方法,它只给出了< code>DataFrame的第一行。任何关于这方面的帮助都将不胜感激。

  • 如何移除第一个数组但返回减去第一个元素的数组 在我的示例中,当删除第一个元素时,我应该得到

  • 问题内容: 我已经迷上了一些SQL,其中有几行数据,我想从上一行中减去一行,并使其一直向下重复。 所以这是表格: 我希望结果显示第三列,称为差异,即从下面的一列减去第一行,最后一行从零减去。 我已经尝试过自我连接,但是我不确定如何限制结果,而不是让结果不断循环。我不能确定id值对于给定的结果集是连续的,所以我不使用该值。我可以扩展架构以包括某种顺序值。 这是我尝试过的: 谢谢您的协助。 问题答案:

  • 问题内容: 我要执行的操作类似于合并。例如,通过合并,我们得到一个数据帧,其中包含第一个AND第二个数据帧中存在的行。通过合并,我们得到一个数据帧,该数据帧在第一个或第二个数据帧中都存在。 我需要的是一个数据帧,其中包含第一个数据帧中存在的行而第二个数据帧中不存在的行?有快速而优雅的方法吗? 问题答案: 如下所示呢? 只要有一个非关键的通用命名列,就可以让在sufffexes上执行的工作(如果没有

  • 问题内容: 我只想知道如何从$ row [posts_remaining]中出现的数字中减去1 换一种说法… 这将给我我的结果,其中row posts_remaining = {THE NUMBER} 但是我想通过从中减去一个数字,然后在旧数字所在的位置设置新数字来更新返回的数字。 我希望我不要让这个令人困惑。很难解释。 另外…为了进行此操作,我是否应该将行“ posts_remaining”设置