Search code examples
rdplyrdata.tableplyr

plyr::join_all: Join columns in several objets doesn't work


I have this problem:

# Packages
library(tidyverse)


# Open band file
bands_F <- read.csv("https://raw.githubusercontent.com/Leprechault/trash/main/bands.csv")
str(bands_F)
# 'data.frame': 2432 obs. of  10 variables:
#  $ STAND  : chr  "MA02ABOB7D" "MA02ABOB7D" "MA02ABOB7D" "MA02ABOB7D" ...
#  $ COMPANY: chr  "KLABIN" "KLABIN" "KLABIN" "KLABIN" ...
#  $ SPACING: chr  "3.3x1.8" "3.3x1.8" "3.3x1.8" "3.3x1.8" ...
#  $ SPECIES: chr  "EUCALYPTUS" "EUCALYPTUS" "EUCALYPTUS" "EUCALYPTUS" ...
#  $ AGE    : int  1 1 1 1 1 1 1 1 1 1 ...
#  $ STATS  : chr  "MEAN" "SD" "MIN" "MAX" ...
#  $ B2     : num  242.6 84.5 102 534 184.3 ...
#  $ B3     : num  359 138 115 867 332 ...
#  $ B4     : num  299 159 87 886 278 ...
#  $ B8     : num  2678 872 901 4721 2695 ...

# Open NDVI file
NDVI_F <- read.csv("https://raw.githubusercontent.com/Leprechault/trash/main/ndvi.csv")
str(NDVI_F)
# 'data.frame': 2432 obs. of  7 variables:
#  $ STAND  : chr  "MA02ABOB7D" "MA02ABOB7D" "MA02ABOB7D" "MA02ABOB7D" ...
#  $ COMPANY: chr  "KLABIN" "KLABIN" "KLABIN" "KLABIN" ...
#  $ SPACING: chr  "3.3x1.8" "3.3x1.8" "3.3x1.8" "3.3x1.8" ...
#  $ SPECIES: chr  "EUCALYPTUS" "EUCALYPTUS" "EUCALYPTUS" "EUCALYPTUS" ...
#  $ AGE    : int  1 1 1 1 1 1 1 1 1 1 ...
#  $ STATS  : chr  "MEAN" "SD" "MIN" "MAX" ...
#  $ NDVI   : num  0.8039 0.0554 0.5768 0.8727 0.8208 ...

I'd like just add NDVI column in bands_F for the same STAND, COMPANY, SPACING, SPECIES, AGE and STATS levels, but if I use plyr::join_all:

# Join all
DS_F_1 <- plyr::join_all(list(bands_F,NDVI_F))
str(DS_F_1)
# 'data.frame': 33808 obs. of  11 variables:
#  $ STAND  : chr  "MA02ABOB7D" "MA02ABOB7D" "MA02ABOB7D" "MA02ABOB7D" ...
#  $ COMPANY: chr  "KLABIN" "KLABIN" "KLABIN" "KLABIN" ...
#  $ SPACING: chr  "3.3x1.8" "3.3x1.8" "3.3x1.8" "3.3x1.8" ...
#  $ SPECIES: chr  "EUCALYPTUS" "EUCALYPTUS" "EUCALYPTUS" "EUCALYPTUS" ...
#  $ AGE    : int  1 1 1 1 1 1 1 1 1 1 ...
#  $ STATS  : chr  "MEAN" "MEAN" "MEAN" "SD" ...
#  $ B2     : num  242.6 242.6 242.6 84.5 84.5 ...
#  $ B3     : num  359 359 359 138 138 ...
#  $ B4     : num  299 299 299 159 159 ...
#  $ B8     : num  2678 2678 2678 872 872 ...
#  $ NDVI   : num  0.8039 0.8208 0.7782 0.0554 0.0598 ...

Doesn't work and a data.frame with 10-factor size (33808 obs.) was created and considering the same levels the size must be 2432 obs. Please any help with it? But merge and dplyr::inner_join is not an option, because in my original dataset a have 11 objects to join and not only 2.

Thanks!


Solution

  • library(ifultools)
    DS_F_1 <- mergeList(bands_F,NDVI_F)
    str(DS_F_1)
    # 'data.frame': 2432 obs. of  11 variables:
    #  $ STAND  : chr  "MA02ABOB7D" "MA02ABOB7D" "MA02ABOB7D" "MA02ABOB7D" ...
    #  $ COMPANY: chr  "KLABIN" "KLABIN" "KLABIN" "KLABIN" ...
    #  $ SPACING: chr  "3.3x1.8" "3.3x1.8" "3.3x1.8" "3.3x1.8" ...
    #  $ SPECIES: chr  "EUCALYPTUS" "EUCALYPTUS" "EUCALYPTUS" "EUCALYPTUS" ...
    #  $ AGE    : int  1 1 1 1 1 1 1 1 1 1 ...
    #  $ STATS  : chr  "MEAN" "SD" "MIN" "MAX" ...
    #  $ B2     : num  242.6 84.5 102 534 184.3 ...
    #  $ B3     : num  359 138 115 867 332 ...
    #  $ B4     : num  299 159 87 886 278 ...
    #  $ B8     : num  2678 872 901 4721 2695 ...
    #  $ NDVI   : num  0.8039 0.0554 0.5768 0.8727 0.8208 ...