มีวิธีจับคู่สองเฟรมข้อมูลที่แตกต่างกันสำหรับหลายคอลัมน์หรือไม่

ฉันต้องการสร้างการเชื่อมโยงระหว่างคอลัมน์ตามเงื่อนไข ฉันมีสองเฟรมข้อมูลดังนี้:

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

และ df ตัวที่สองคือ:

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)

เงื่อนไขคือ ตัวอย่างเช่น ใน df2 คือ cost1 หากค่ามากกว่าหรือเท่ากับ 4 ใน df1 จะได้รับ "y" มิฉะนั้นจะได้รับ "n" ในราคา 2 ถ้าค่ามากกว่าหรือเท่ากับ 7 ใน df1 จะได้ "y" มิฉะนั้นจะได้ "n" และอื่นๆ โปรดสมมติว่าฉันมีมากกว่าสี่คอลัมน์

ผลลัพธ์จะเป็นดังนี้:

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)

ตอนนี้ฉันจำเป็นต้องทำมันโดยใช้ ifelse แต่ฉันพยายามทำมันเพื่อตัวอย่างนี้ ความช่วยเหลือของคุณมีค่ามาก


person Community    schedule 30.11.2019    source แหล่งที่มา


คำตอบ (2)


อาจมีวิธีแก้ปัญหาที่ดีกว่าและหรูหรากว่านี้ที่ฉันยังไม่ได้คิด แต่การใช้ for loop กับฟังก์ชัน ifelse คุณสามารถทำสิ่งที่คล้ายกันได้:

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)

และคุณจะได้รับผลลัพธ์ต่อไปนี้:

> 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

นี่คือวิธีแก้ปัญหาโดยไม่ใช้ 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)

ซึ่งจะช่วยให้:

> 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