【问题标题】:How to add modified row to dataframe in R?如何将修改后的行添加到 R 中的数据框?
【发布时间】:2018-10-23 07:54:36
【问题描述】:

我已经创建了一个函数,它可以增加某行中某些列中的值。为此,我编写了一个函数,该函数通过我的数据框进行子集化以找到它需要的行(通过查看性别、年龄、剥夺、然后是合作伙伴的数量),然后将数字添加到我需要的任何列(取决于这些风险因素),然后计算风险(我的代码用于 STI 测试)。

但是,这不会用新值更改我现有的数据框,而是创建一个新变量 patientRow 来保存这些新值。我需要有关如何将其合并到现有数据框中的帮助。谢谢!

adaptRisk <- function(dataframe, sexNum, ageNum, deprivationNum, 
              partnerNum, testResult){
sexRisk = subset(dataframe, sex == sexNum)
ageRisk = subset(sexRisk, age == ageNum)
depRisk = subset(ageRisk, deprivation == deprivationNum)
patientRow = subset(depRisk, partners == partnerNum)
 if (testResult == "positive") {
   patientRow$tested <- patientRow$tested + 1
   patientRow$infected <- patientRow$infected + 1
}
 else if (testResult == "negative") {
   patientRow$tested <- patientRow$tested + 1
}
patientRow <- transform(patientRow, risk = infected/tested)
return(patientRow)
}

这是我的数据框的头,给你一个想法:

  sex    age    deprivation partners tested infected risk
1 Female 16-19  1-2         0-1      132    1        0.007575758
2 Female 16-19  1-2         2        25     1        0.040000000
3 Female 16-19  1-2         >=3      30     1        0.033333333
4 Female 16-19  3           0-1      80     2        0.025000000
5 Female 16-19  3           2        12     1        0.083333333
6 Female 16-19  3           >=3      18     1        0.055555556

我的数据的输出是:

structure(list(sex = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = 
c("Female", 
"Male"), class = "factor"), age = structure(c(1L, 1L, 1L, 1L, 
1L, 1L), .Label = c("16-19", "20-24", "25-34", "35-44"), class = 
"factor"), 
deprivation = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("1-2", 
"3", "4-5"), class = "factor"), partners = structure(c(2L, 
3L, 1L, 2L, 3L, 1L), .Label = c(">=3", "0-1", "2"), class = "factor"), 
tested = c(132L, 25L, 30L, 80L, 12L, 18L), infected = c(1L, 
1L, 1L, 2L, 1L, 1L), uninfected = c(131L, 24L, 29L, 78L, 
11L, 17L), risk = c(0.00757575757575758, 0.04, 0.0333333333333333, 
0.025, 0.0833333333333333, 0.0555555555555556)), .Names = c("sex", 
"age", "deprivation", "partners", "tested", "infected", "uninfected", 
"risk"), row.names = c(NA, 6L), class = "data.frame")

函数调用示例:

adaptRisk(data, "Female", "16-19", 3, 2, "positive")
     sex   age deprivation partners tested infected uninfected      risk
5 Female 16-19           3        2     13        2         11 0.1538462

【问题讨论】:

  • 您能创建一个最小的工作示例并添加更多代码吗?您使用哪个语句来运行您的功能。并且 dput(head(yourdataframe)) 会有所帮助。你可以在这里看看我所说的minimal working example 是什么意思
  • 您的函数的输出看起来像是一个数据框,其列与原始数据框中的列不匹配。因此,您将遇到问题,因为您正在“合并”两个列不完全匹配的数据框。
  • @phiver 感谢您的回复!我已添加 dput,非常感谢您的帮助!
  • @J.Win。我不明白你的意思?因为通过数据框的子集保留了列,我没有添加/删除任何东西。当我打印 patientRow 时,它与我的数据框是相同的列

标签: r dataframe machine-learning row subset


【解决方案1】:

我已经使用基本 R 语法调整了你的函数(见下文)。它可以完成这项工作,但不是最漂亮的代码。

问题: 子集创建了很多额外的(并且不需要的)data.frames,而不是在条件匹配时替换内部值。并且返回的是不同的 data.frame,因此现有的 data.frame 无法正确处理。

我对其进行了调整,以便在您想要更改的所需对象上完成过滤器。

转换可能会产生意想不到的副作用,并且您正在重新计算整个风险列。现在只重新计算受影响的值。

您可能希望内置一些警告/停止,以防过滤器返回超过 1 条记录。

您现在可以使用 df &lt;- adaptRisk(df, "Female", "16-19", "3", "2", "positive") 替换你提供给函数的 data.frame 中的值

例子

# affects row 5
adaptRisk(df, "Female", "16-19", "3", "2", "positive") 
     sex   age deprivation partners tested infected uninfected        risk
1 Female 16-19         1-2      0-1    132        1        131 0.007575758
2 Female 16-19         1-2        2     25        1         24 0.040000000
3 Female 16-19         1-2      >=3     30        1         29 0.033333333
4 Female 16-19           3      0-1     80        2         78 0.025000000
5 Female 16-19           3        2     13        2         11 0.153846154
6 Female 16-19           3      >=3     18        1         17 0.055555556

# affects row 5    
adaptRisk(df, "Female", "16-19", "3", "2", "negative")
     sex   age deprivation partners tested infected uninfected        risk
1 Female 16-19         1-2      0-1    132        1        131 0.007575758
2 Female 16-19         1-2        2     25        1         24 0.040000000
3 Female 16-19         1-2      >=3     30        1         29 0.033333333
4 Female 16-19           3      0-1     80        2         78 0.025000000
5 Female 16-19           3        2     13        1         11 0.076923077
6 Female 16-19           3      >=3     18        1         17 0.055555556

功能:

adaptRisk <- function(data, sexNum, ageNum, deprivationNum, 
                      partnerNum, testResult){

    if (testResult == "positive") {
    data$tested[data$sex == sexNum & 
               data$age == ageNum &
               data$deprivation == deprivationNum &
               data$partners == partnerNum] <- data$tested[data$sex == sexNum & 
                                                             data$age == ageNum &
                                                             data$deprivation == deprivationNum &
                                                             data$partners == partnerNum] + 1 
    data$infected[data$sex == sexNum & 
                  data$age == ageNum &
                  data$deprivation == deprivationNum &
                  data$partners == partnerNum] <- data$infected[data$sex == sexNum & 
                                                                  data$age == ageNum &
                                                                  data$deprivation == deprivationNum &
                                                                  data$partners == partnerNum] + 1 
    data$risk[data$sex == sexNum &
              data$age == ageNum &
              data$deprivation == deprivationNum &
              data$partners == partnerNum] <- data$infected[data$sex == sexNum & 
                                                                   data$age == ageNum &
                                                                   data$deprivation == deprivationNum &
                                                                   data$partners == partnerNum]/data$tested[data$sex == sexNum & 
                                                                                                              data$age == ageNum &
                                                                                                              data$deprivation == deprivationNum &
                                                                                                              data$partners == partnerNum]

  }
  else if (testResult == "negative") {
    data$tested[data$sex == sexNum & 
                data$age == ageNum &
                data$deprivation == deprivationNum &
                data$partners == partnerNum] <- data$tested[data$sex == sexNum & 
                                                              data$age == ageNum &
                                                              data$deprivation == deprivationNum &
                                                              data$partners == partnerNum] + 1  

   data$risk[data$sex == sexNum &
             data$age == ageNum &
             data$deprivation == deprivationNum &
             data$partners == partnerNum] <- data$infected[data$sex == sexNum & 
                                                             data$age == ageNum &
                                                             data$deprivation == deprivationNum &
                                                             data$partners == partnerNum]/data$tested[data$sex == sexNum & 
                                                                                                        data$age == ageNum &
                                                                                                        data$deprivation == deprivationNum &
                                                                                                        data$partners == partnerNum]
  }
  return(data)
}

【讨论】:

  • 这真的很有帮助,谢谢你这样做!我理解你所说的子集的意思,这是一种更好的(虽然有点难以阅读)的方式!
【解决方案2】:

该函数输出一行——显然——您打算替换原始行。您可以通过执行以下操作替换原始行:

## original data frame is named patientData
patientRow <- adaptRisk(data, "Female", "16-19", 3, 2, "positive") 
patientData[row.names(patientRow), ] <- patientRow

【讨论】:

    猜你喜欢
    • 2018-05-11
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多