将函数应用于数据帧,并包括从第二个数据帧到第一个数据帧的一个新列,其大小在R中不同

将函数应用于数据帧,并包括从第二个数据帧到第一个数据帧的一个新列,其大小在R中不同,r,apply,R,Apply,我是R的新手,想知道做以下事情的最好方法是什么- 我的实际问题是一个多元回归模型,但它是一个相当大的数据集(>5000行和12列),因此我设计了一个类似的较短的问题。以下问题的解决方案可以复制以解决我的实际问题。如果您在以下方面有任何帮助(包括速度问题),我们将不胜感激- 我有以下两个数据帧-d1和d2 d1 - sno letter age 1 a 29 2 b 30 3 a 33 4 b 22 5

我是R的新手,想知道做以下事情的最好方法是什么-

我的实际问题是一个多元回归模型,但它是一个相当大的数据集(>5000行和12列),因此我设计了一个类似的较短的问题。以下问题的解决方案可以复制以解决我的实际问题。如果您在以下方面有任何帮助(包括速度问题),我们将不胜感激- 我有以下两个数据帧-d1和d2

d1 -
   sno letter age
   1      a  29
   2      b  30
   3      a  33
   4      b  22
   5      c  25
d2-
  letter marks
     a    40
     b    90
     c    60
现在,我想使用Mark_代码计算a、b、c是否通过d2考试,然后将相应的成绩包含在d1中。所以我的最终输出应该是这样的-

d1 -
   sno letter age grade
   1      a  29     0
   2      b  30     1
   3      a  33     0
   4      b  22     1
   5      c  25     1
下面是我写的代码-(我没有得到我想要的结果!)


d1您应该为此使用
ifelse
,因为与
if
不同,它是矢量化的

d1 <- read.table(text="  sno letter age
1      a  29
2      b  30
3      a  33
4      b  22
5      c  25",header=TRUE)

d2 <- read.table(text="  letter marks
a    40
b    90
c    60",header=TRUE)

res <- merge(d1,d2)
res$grade <- ifelse(res$marks <= 40, 0, 1)

res <- res[order(res$sno),]

#   letter sno age marks grade
# 1      a   1  29    40     0
# 3      b   2  30    90     1
# 2      a   3  33    40     0
# 4      b   4  22    90     1
# 5      c   5  25    60     1

d1这里有一种不同的方法:

d1$grade <- 
as.numeric(sapply(d1$letter, FUN=function(z) d2[d2$letter==z,"marks"]>40))

使用
数据。表

require(data.table)
d1 <- as.data.table(d1)
d2 <- as.data.table(d2)
setkey(d1, "letter")
setkey(d2, "letter")
out <- d2[d1][, grade := (marks > 40) * 1]
setcolorder(out, c("letter", "sno", "age", "marks", "grade"))

 #    letter sno age marks grade
 # 1:      a   1  29    40     0
 # 2:      a   3  33    40     0
 # 3:      b   2  30    90     1
 # 4:      b   4  22    90     1
 # 5:      c   5  25    60     1

这使用了一个不必要的循环。是的,这是第一步。我添加了第二个版本。非常感谢!这是一种非常简洁的方法。我想对于实际问题我也可以这样做。
d1$grade <- 
as.numeric(d2$marks[pmatch(d1$letter, d2$letter, duplicates.ok=TRUE)] > 40)
require(data.table)
d1 <- as.data.table(d1)
d2 <- as.data.table(d2)
setkey(d1, "letter")
setkey(d2, "letter")
out <- d2[d1][, grade := (marks > 40) * 1]
setcolorder(out, c("letter", "sno", "age", "marks", "grade"))

 #    letter sno age marks grade
 # 1:      a   1  29    40     0
 # 2:      a   3  33    40     0
 # 3:      b   2  30    90     1
 # 4:      b   4  22    90     1
 # 5:      c   5  25    60     1
setkey(out, "sno")