【问题标题】:update values of only certain rows in dataset1, with values from dataset2 in R - but only the ones that don't match, or else keep the original?仅更新 dataset1 中某些行的值,使用 R 中 dataset2 中的值 - 但仅更新不匹配的值,或者保留原始值?
【发布时间】:2017-07-06 12:08:57
【问题描述】:

所以,我有两个数据框,一个是原始数据框,另一个是从原始数据中提取的行,然后更改其中一列中的值。

他们都有相同的号码。列 (10),但原始大于第二个。两者的数据类型相同,我需要替换由因子组成的一列中的值。我试过 left_join 和 merge 但我遇到了错误,这可能是我的错误,但我不知道我做错了什么,因为我仍然没有正确理解 R。

例如。数据框 1:

  1. ALB 医学
  2. SKJ 方程
  3. ALB 环流
  4. BUM 方程
  5. WHM 翻译
  6. YFT 方程

数据框 2:

  1. ALB 北机场
  2. BUM South Atl
  3. WHM 环流
  4. YFT 环流

我想得到的帽子:

  1. ALB 医学
  2. SKJ 方程
  3. ALB 北机场
  4. BUM South Atl
  5. WHM 环流
  6. YFT 环流

R(dataset1)的原始数据摘录:

    > print(catchesbyPPOW[1:10,])
   Species  Long   Lat tCatch_sqrt        ECOREGION                   REALM          PROVINC TYPE
1      ALB  17.5 -57.5   0.5099020             <NA>     Southern Cold Water        Antarctic PPOW
2      YFT  17.5 -57.5   0.2812472             <NA>     Southern Cold Water        Antarctic PPOW
3      BFT -67.5 -52.5   2.9238673 Patagonian Shelf Temperate South America       Magellanic MEOW
4      BFT -62.5 -52.5   3.2256782             <NA>     Atlantic Warm Water Malvinas Current PPOW
5      ALB -52.5 -52.5   0.2323575             <NA>     Southern Cold Water     Subantarctic PPOW
6      SWO -52.5 -52.5   0.9996549             <NA>     Southern Cold Water     Subantarctic PPOW
7      ALB -32.5 -52.5   0.4097926             <NA>     Southern Cold Water        Antarctic PPOW
8      BET -32.5 -52.5   1.4336387             <NA>     Southern Cold Water        Antarctic PPOW
9      SWO -32.5 -52.5   1.2541730             <NA>     Southern Cold Water        Antarctic PPOW
10     YFT -32.5 -52.5   1.2215236             <NA>     Southern Cold Water        Antarctic PPOW
                BIOME optional
1               Polar     TRUE
2               Polar     TRUE
3                <NA>     TRUE
4  Boundary - western     TRUE
5               Polar     TRUE
6               Polar     TRUE
7               Polar     TRUE
8               Polar     TRUE
9               Polar     TRUE
10              Polar     TRUE

数据集 2:

> print(outliers[1:10,])
    Species  Long   Lat tCatch_sqrt                  ECOREGION                   REALM TYPE BIOME optional
3       BFT -67.5 -52.5   2.9238673           Patagonian Shelf Temperate South America MEOW  <NA>     TRUE
39      SWO -62.5 -42.5   0.6316645     North Patagonian Gulfs Temperate South America MEOW  <NA>     TRUE
130     ALB -57.5 -37.5   7.6342489 Uruguay-Buenos Aires Shelf Temperate South America MEOW  <NA>     TRUE
131     BET -57.5 -37.5   0.8367258 Uruguay-Buenos Aires Shelf Temperate South America MEOW  <NA>     TRUE
132     BUM -57.5 -37.5   0.5127475 Uruguay-Buenos Aires Shelf Temperate South America MEOW  <NA>     TRUE
133     SAI -57.5 -37.5   1.3915028 Uruguay-Buenos Aires Shelf Temperate South America MEOW  <NA>     TRUE
134     SKJ -57.5 -37.5   1.2453915 Uruguay-Buenos Aires Shelf Temperate South America MEOW  <NA>     TRUE
135     SWO -57.5 -37.5   2.4453357 Uruguay-Buenos Aires Shelf Temperate South America MEOW  <NA>     TRUE
136     WHM -57.5 -37.5   0.2320991 Uruguay-Buenos Aires Shelf Temperate South America MEOW  <NA>     TRUE
137     YFT -57.5 -37.5   2.2360680 Uruguay-Buenos Aires Shelf Temperate South America MEOW  <NA>     TRUE
             PROVINC
3   Malvinas Current
39  Malvinas Current
130 Malvinas Current
131 Malvinas Current
132 Malvinas Current
133 Malvinas Current
134 Malvinas Current
135 Malvinas Current
136 Malvinas Current
137 Malvinas Current

我删除了我失败的尝试,我只保留了我用 left_join 尝试过的最新一次:

PPOWoutliers<-left_join(catchesbyPPOW, outliers, by = NULL)

这给了我这个警告:

Joining, by = c("Species", "Long", "Lat", "tCatch_sqrt", "ECOREGION", "REALM", "PROVINC", "TYPE", "BIOME", "optional")
Warning message:
In left_join_impl(x, y, by$x, by$y, suffix$x, suffix$y) :
  joining factors with different levels, coercing to character vector

【问题讨论】:

  • 您能以易于粘贴的形式提供数据吗?您尝试了哪些方法但似乎不起作用?
  • 嗨 @RomanLuštrik 我刚刚更新了描述,希望对您有所帮助!
  • 请注意,您的数据集中的列似乎不一样(正如您在文本中建议的那样)
  • 顺序可能是的,但名称应该相同,我错过了什么?
  • BIOMEoptional 不在第二个数据集中

标签: r join dataframe merge


【解决方案1】:

已编辑以反映您在两个数据集上可能没有相同的列

合并不考虑行名。

试试这个:

columns_to_replace <- c("ECOREGION","REALM","TYPE")
dfnew <- df1
dfnew[as.numeric(rownames(df2)),columns_to_replace] <- df2[,columns_to_replace]

或者如果您在两个数据集上具有相同的列,则这样做:

dfnew[as.numeric(rownames(df2)),] <- df2

【讨论】:

  • 正如@Miff 在问题 cmets 中指出的那样,如果您的列在两个数据集中不同,它就无法工作,您究竟想替换哪些字段?
  • 我想用异常值数据集中的新值替换 PROVINC 列中的值,两者不同,或者保留原始值。列应该相同,顺序不同,因为当我更新值时,列 PROVINC 在第二个中移动。
  • 我编辑了我的代码以反映这一点,您可以将任何列名放在columns_to_replace 变量中
  • 谢谢...我尝试了这两种方法,但我都得到了这个:警告消息:在[&lt;-.factor(*tmp*, iseq, value = c(7L, 7L, 7L, 7L , 7L, 7L, : 无效因子水平,NA生成
  • 在构建这些data.frames时,可能使用as.data.frameread.csv等,添加参数stringsAsFactors = FALSE
【解决方案2】:

非常感谢您的帮助! 我终于找到了办法。 我使用我想在 dataset2 中使用不同名称更改的变量对数据集进行了 left_join。然后我做了一个 for 循环,用原始列中的值替换所有生成的 NA,它起作用了。

library(dplyr)

PPOWoutliers <-left_join(catchesbyPPOW, outliers, by = NULL)
summary(PPOWoutliers)

for (i in 1:2448){
   if (is.na(PPOWoutliers[i,11])==TRUE){
     PPOWoutliers[i,12] <- as.character(PPOWoutliers[i,7])}
  else{
    PPOWoutliers[i,12] <- as.character(PPOWoutliers[i,11])}
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多