Apakah ada cara untuk mencocokkan dua bingkai data berbeda untuk beberapa kolom

Saya ingin membuat tautan antar kolom dengan syarat. Saya memiliki dua bingkai data sebagai berikut:

df1<-read.table(text=" gol
4
7
6
9
",header=TRUE)

dan df kedua adalah:

df2<-read.table(text=" cost1	cost2	cost3	cost4
7	9	5	13
3	12	4	14
9	13	3	11
5	6	2	13
4	3	5	12
8	16	6	9
9	11	2	9
6	14	11	12
5	10	14	6
2	9	4	12

",header=TRUE)

Syaratnya misalnya di df2, biaya1, jika nilainya lebih besar atau sama dengan 4 di df1 maka mendapat "y" kalau tidak mendapat "n". di Biaya 2 jika nilainya lebih besar atau sama dengan 7 di df1, mendapat "y" jika tidak, mendapat "n" dan seterusnya. Harap asumsikan saya memiliki lebih dari empat kolom.

Hasilnya adalah sebagai berikut:

output<-read.table(text=" cost1	cost2	cost3	cost4	out1	out2	out3	out4
7	9	5	13	y	y	n	y
                   3	12	4	14	n	y	n	y
                   9	13	3	11	y	y	n	y
                   5	6	2	13	y	n	n	y
                   4	3	5	12	y	n	n	y
                   8	16	6	9	y	y	y	y
                   9	11	2	9	y	y	n	y
                   6	14	11	12	y	y	y	y
                   5	10	14	6	y	y	y	n
                   2	9	4	12	n	y	n	y
                   ",header=TRUE)

Saya baru saja perlu melakukannya menggunakan ifelse, tetapi saya kesulitan melakukannya untuk contoh ini. Bantuan Anda sangat saya hargai.


person Community    schedule 30.11.2019    source sumber


Jawaban (2)


Mungkin ada solusi yang lebih baik dan lebih elegan yang belum saya pikirkan, tetapi menggunakan loop for dengan fungsi ifelse, Anda dapat melakukan hal seperti itu:

dfx <- data.frame(matrix(ncol=ncol(df2),nrow = nrow(df2)))
for(i in 1:ncol(df2))
{
  dfx[,i] <- ifelse(df2[,i] >= df1[i,1],"y","n")
  colnames(dfx)[i] <- paste0("out",i)
}
out <- cbind(df2,dfx)

Dan Anda mendapatkan output berikut:

> out
   cost1 cost2 cost3 cost4 out1 out2 out3 out4
1      7     9     5    13    y    y    n    y
2      3    12     4    14    n    y    n    y
3      9    13     3    11    y    y    n    y
4      5     6     2    13    y    n    n    y
5      4     3     5    12    y    n    n    y
6      8    16     6     9    y    y    y    y
7      9    11     2     9    y    y    n    y
8      6    14    11    12    y    y    y    y
9      5    10    14     6    y    y    y    n
10     2     9     4    12    n    y    n    y
person dc37    schedule 30.11.2019

Berikut solusinya tanpa menggunakan for-loop:

r <- setNames(data.frame(as.matrix(df2)>=outer(rep(1,nrow(df2)),df1$gol)),
              paste0("out",seq(ncol(df2))))
r[r==T] <- "y"
r[r==F] <- "n"
res <- cbind(df2,r)

yang memberikan:

> res
   cost1 cost2 cost3 cost4 out1 out2 out3 out4
1      7     9     5    13    y    y    n    y
2      3    12     4    14    n    y    n    y
3      9    13     3    11    y    y    n    y
4      5     6     2    13    y    n    n    y
5      4     3     5    12    y    n    n    y
6      8    16     6     9    y    y    y    y
7      9    11     2     9    y    y    n    y
8      6    14    11    12    y    y    y    y
9      5    10    14     6    y    y    y    n
10     2     9     4    12    n    y    n    y
person ThomasIsCoding    schedule 30.11.2019