当前位置: 首页 > 知识库问答 >
问题:

使用数据中的行操作创建新列。表R

公冶威
2023-03-14

我在R中有两个数据表,如下:

DT_A具有列siddatevalue e1value e2,其中sid是主键,date是次要键。

DT_B有列siddate1date2date3、......、date12。这里sid是主键,因此每一行对应于唯一的sid,其他列名对应于DT_A中的辅助键。

我想在< code>DT_A中添加另一列,其中第I行包含表DT_B[sid_i,date_i]中的相应元素

下面是示例代码和所需输出:

require(data.table)
DT_A <- data.table(sid = c(1,2,3,4,5,1,3), 
                   date = c("Jan 2012", "Feb 2012", "April 2012", "May 2012", 
                            "Dec 2012", "Feb   2012", "Oct 2012"),
                   value1 = rep("1", 7), 
                   value2 = rep("1", 7))

DT_B <- data.table(sid = as.character(c(1,2,3,4,5)), 
                   "Jan 2012" = rep("1", 5),
                   "Feb 2012" = rep("2", 5),
                   "March 2012" = rep("3", 5),
                   "April 2012" = rep("4", 5),
                   "May 2012" = rep("5", 5),
                   "June 2012" = rep("6", 5),
                   "July 2012" = rep("7", 5),
                   "Aug          2012" = rep("8", 5),
                   "Sept 2012" = rep("9", 5),
                   "Oct 2012" = rep("10", 5),
                   "Nov 2012" = rep("11", 5),
                   "Dec 2012" = rep("12", 5))

#Set Keys
setkey(DT_A, sid, date)
setkey(DT_B, sid)

#Define Function fun1
fun1 <- function(x){ 
    tryCatch(DT_B[x[1], x[2], with=FALSE], error = function(e) NULL)
}

#Desired Output
DT_A$newCol <- sapply(apply(DT_A, 1, fun1),"[[",1)
DT_A

虽然我当前的方法在这个小例子上有效,但我的实际DT_A有2000万行,这个方法完全挂在那里,我们可以使用data.table或任何其他方法以更有效的方式进行此操作吗?

共有1个答案

慕容念
2023-03-14

熔化第二个<code>数据。表:

library(reshape2)

DT_B.melted = melt(DT_B, id.vars = 'sid', variable.name = 'date')

一旦它融化了,你就可以把两者设置成同一个键,然后做你的join/assign/whatnot:

setkey(DT_B.melted, sid, date)
setkey(DT_A, sid, date)

DT_A[DT_B.melted, newCol := value]
 类似资料:
  • 假设我有这样一个数据frame: 我希望创建另一个dataframe,在每行中从左到右显示关系,同时跳过具有空值的列。此外,只有1个有效列记录的行将被排除。例如: 我认为方法应该是编写一个包含此逻辑的UDF,但我不完全确定如何返回一个全新的DF,因为我习惯了UDF只是在同一个DF中创建另一列。或者是否有另一个spark函数可以比创建UDF更容易地处理这种情况?如果有关系,就使用pyspark。

  • 问题内容: 我正在尝试创建一个新表,该表将包含三个现有表中的选定数据。 现有的三个表设置如下,我想要的结果在底部: 在此先感谢您的帮助! 问题答案: 您需要进行三向联接: 演示 或者,如果您已经创建了表,则可以执行以下操作: 要获得多个属性,您必须分别为每个属性将详细信息和分类表联接在一起:

  • 下面是关于中的行操作的一个很好的SO解释 我想到的一个替代方法是为每一行使用一个唯一的< code>id,然后使用< code>by参数应用一个函数。像这样: 问题: > 有没有好的理由不使用这种方法?也许还有其他更有效的选择? 为什么使用< code>by =。我不一样了? < code>dt[,sdd := sd(。SD[,-1,with=FALSE]),by =。I ]

  • 问题内容: 我有这样的数据我想创建一个PySpark数据框 我已经用过 但我总是得到 我如何获得如下所示的结果? 问题答案: 我发现将参数视为元组列表很有用,其中列表中的每个条目对应于DataFrame中的一行,而元组的每个元素对应于一列。 您可以通过将列表中的每个元素设为元组来获得所需的输出: 或者,如果更改源很麻烦,则可以等效地执行以下操作:

  • 刚开始使用熊猫和python。 我有一个工作表,我已经读到一个数据框和应用的正向填充(ffill)方法。 然后我想创建一个包含两个工作表的excel文档。 在应用FFIL方法之前,一个工作表的数据帧中包含数据,而下一个工作表的数据帧应用了FFIL方法。 最终,我打算为数据框的某一列中的每个唯一数据实例创建一个工作表。 然后我想应用一些vba格式的结果-但我不确定哪个dll或插件或东西,我需要调用e

  • 我试图弄清楚如何通过使用与哥伦布()函数并在pySpark中的cp_codeset列()函数中调用udf来动态地为列表中的每个项目创建列(在这种情况下为列表)。下面是我写的代码,但它给了我一个错误。 另一种选择是手动执行它,但在这种情况下,我必须编写相同的udf函数并使用养分()函数调用它75次(这是cp_codeset["col_names"]的大小) 下面是我的两个数据帧,我正在尝试获得结果如