【问题标题】:populate a new column in a df with new values用新值填充 df 中的新列
【发布时间】:2015-06-14 23:23:09
【问题描述】:

我希望使用每个数据子组独有的计算值填充一个新的数据框列。这是我的确切代码:

 df <- read.csv('data_30_Mar2015.csv')


 df$dCT <- NA

 #FUNCTION
 calc_dCT <- function(sample, DF){

 sample_df <- DF[ which(DF$Sample=='sample'),]
 print (sample_df)
 VIC <- sample_df[ which(sample_df$Reporter=='VIC'),]
 FAM <- sample_df[ which(sample_df$Reporter=='FAM'),]

 VIC_mean<-mean(VIC[,3])
 FAM_mean<-mean(FAM[,3])

 DCT <- FAM_mean - VIC_mean

 for (i in 1:length(sample_df)){
     sample_df[i,4] <- DCT
     }
 DF<-merge(DF, sample_df, all=TRUE)
 }

 #CALLS TO FUNCTION
 calc_dCT('c48', df)
 calc_dCT('m48', df)
 calc_dCT('c72', df)
 calc_dCT('m72', df)

 print (df)

这是输出:

 calc_dCT('c48', df)
 [1] Sample   Reporter CT       dCT     
 <0 rows> (or 0-length row.names)
 calc_dCT('m48', df)
 [1] Sample   Reporter CT       dCT     
 <0 rows> (or 0-length row.names)
 calc_dCT('c72', df)
 [1] Sample   Reporter CT       dCT     
 <0 rows> (or 0-length row.names)
 calc_dCT('m72', df)
 [1] Sample   Reporter CT       dCT     
 <0 rows> (or 0-length row.names)

 print (df)
Sample Reporter       CT dCT
1     m48      VIC 27.50595  NA
2     m48      VIC 27.77835  NA
3     m48      VIC 27.62321  NA
4     m48      FAM 30.87295  NA
5     m48      FAM 30.87967  NA
6     m48      FAM 30.73427  NA
7     c48      VIC 26.56715  NA
8     c48      VIC 26.89787  NA
9     c48      VIC 26.82587  NA
10    c48      FAM 30.20642  NA
11    c48      FAM 30.43074  NA
12    c48      FAM 30.36933  NA
13    m72      VIC 29.61585  NA
14    m72      VIC 28.65742  NA
15    m72      VIC 29.40057  NA
16    m72      FAM 32.27304  NA
17    m72      FAM 32.38696  NA
18    m72      FAM 32.24386  NA
19    c72      VIC 28.22370  NA
20    c72      VIC 28.17342  NA
21    c72      VIC 28.49104  NA
22    c72      FAM 31.91751  NA
23    c72      FAM 31.67524  NA
24    c72      FAM 31.87287  NA

它似乎没有正确地对数据进行子集化,我不确定为什么会这样。我正在尝试使用 DCT 的计算值填充“dCT”列。

【问题讨论】:

  • 您能用文字解释一下您要达到的目标吗?什么是 DCT?为什么你运行DF$Sample=='sample'DF$Sample 中没有值等于sample?你想要的输出到底是什么?
  • 如果您查看 df,例如在示例“m48”中:DCT = FAM 的平均值 - VIC 的平均值。我希望将这个平均值添加到“m48”的每一行。然后我想对“c48”等重复该过程。DF$Sample== sample,其中 sample 是提供给函数的变量,感谢您发现“sample”,它应该只是没有语音标记的样本。但仍然没有计算 VIC 的平均值 - FAM 的平均值并附加到 df。
  • 请记住始终发布可复制粘贴的数据,例如使用 dput 或类似的东西。见stackoverflow.com/questions/5963269/…

标签: r for-loop dataframe


【解决方案1】:

这是使用data.table 的可能解决方案(假设您没有dCT 列)

library(data.table) 
setDT(df)[, dCT := mean(CT[Reporter=='FAM']) - mean(CT[Reporter=='VIC']), by = Sample][]
# Sample Reporter       CT      dCT
# 1:    m48      VIC 27.50595 3.193127
# 2:    m48      VIC 27.77835 3.193127
# 3:    m48      VIC 27.62321 3.193127
# 4:    m48      FAM 30.87295 3.193127
# 5:    m48      FAM 30.87967 3.193127
# 6:    m48      FAM 30.73427 3.193127
# 7:    c48      VIC 26.56715 3.571867
# 8:    c48      VIC 26.89787 3.571867
...

【讨论】:

    【解决方案2】:

    同样的事情显然可以在dplyr 中完成,所以我只是想添加另一个版本。

    df <- data.frame(Sample = c(rep("m48", 6), rep("c48", 6)), Reporter = c(rep("VIC", 3), rep("FAM", 3), rep("VIC", 3), rep("FAM", 3)), CT = c(27.50595, 27.77835, 27.62321, 30.87295, 30.87967, 30.73427, 26.56715, 26.89787, 26.82587, 30.20642, 30.43074, 30.36933))
    
    library(dplyr)
    df %>% group_by(Sample) %>% 
        mutate(dCT = mean(CT[Reporter == 'FAM']) - mean(CT[Reporter == 'VIC']))
    # Source: local data frame [12 x 4]
    # Groups: Sample
    #
    #    Sample Reporter       CT      dCT
    # 1     m48      VIC 27.50595 3.193127
    # 2     m48      VIC 27.77835 3.193127
    # 3     m48      VIC 27.62321 3.193127
    # 4     m48      FAM 30.87295 3.193127
    # 5     m48      FAM 30.87967 3.193127
    # 6     m48      FAM 30.73427 3.193127
    # 7     c48      VIC 26.56715 3.571867
    # 8     c48      VIC 26.89787 3.571867
    # 9     c48      VIC 26.82587 3.571867
    # 10    c48      FAM 30.20642 3.571867
    # 11    c48      FAM 30.43074 3.571867
    # 12    c48      FAM 30.36933 3.571867
    

    仅仅因为我知道收到“你做的不好,不如做这个”的回复并不令人满意 - 这里有一些关于你的原件不适用的注释代码。 但是请注意,我仍然推荐其他解决方案之一。

    1. R 通过值而不是引用传递函数参数。这表示 您不能从函数内部更改数据框 df, 因为您只是在处理副本。你宁愿返回一个 结果,然后使用此结果修改 df。
    2. length(dataframe) 没有做你认为它做的事情:它返回列数,而不是行数。你想要的是nrow(dataframe)
    3. 为数据框中列的每个元素分配一个常量值不需要循环;只需赋值,R 就会自动展开。

    所以这是一个有效的代码版本:

    calc_dCT <- function(sample, DF){
    
        sample_df <- DF[ which(DF$Sample==sample),]
        VIC <- sample_df[ which(sample_df$Reporter=='VIC'),]
        FAM <- sample_df[ which(sample_df$Reporter=='FAM'),]
    
        VIC_mean<-mean(VIC[,3])
        FAM_mean<-mean(FAM[,3])
    
        DCT <- FAM_mean - VIC_mean
    
        sample_df$dCT <- DCT
    
        sample_df
    }
    
    dfnew <- data.frame(Sample=character(), Reporter=character(), CT=numeric(), dCT=numeric())
    for (sample_name in unique(df$Sample))
        dfnew <- rbind(dfnew, calc_dCT(sample_name, df))
    

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 2020-12-09
      • 2020-09-16
      • 2020-08-16
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      相关资源
      最近更新 更多