【问题标题】:apply create columns function to a list r将创建列函数应用于列表 r
【发布时间】:2015-07-16 16:41:35
【问题描述】:

我刚开始同时使用 apply 和 functions,我感到困惑和沮丧。我有 2 个不同的数据框列表,当满足与第二个相关的条件时,我需要向第一个添加一定数量的列。下面是第一个列表的结构,该列表具有任何站点的一个数据框,并且每个 df 具有每个压力的 2 列或更多列:

> str(KDzlambdaEG)
List of 3
$ 176:'data.frame':    301 obs. of  3 variables:
..$ 0 : num [1:301] 0.186 0.182 0.18 0.181 0.177 ...
..$ 5 : num [1:301] 0.127 0.127 0.127 0.127 0.127 ...
..$ 20: num [1:301] 0.245 0.241 0.239 0.236 0.236 ...
$ 177:'data.frame':    301 obs. of  2 variables:
..$ 0 : num [1:301] 0.132 0.132 0.132 0.13 0.13 ...
..$ 25: num [1:301] 0.09 0.092 0.0902 0.0896 0.0896 ...
$ 199:'data.frame':    301 obs. of  2 variables:
..$ 0 : num [1:301] 0.181 0.182 0.181 0.182 0.179 ...
..$ 10: num [1:301] 0.186 0.186 0.185 0.183 0.184 ...

另一方面,我有第二个列表,其中包含我需要在第一个列表的每个数据框的每一列之后添加的列数:

> str(dif)
List of 3
[[176]]
[1]  4 15 28
[[177]]
[1] 24 67
[[199]]
[1]  9 53

我已经尝试了很多东西,使用出现在以下位置的 append_col 函数: How to add a new column between other dataframe columns?

for (i in 1:length(dif)){
A<-lapply(KDzlambdaEG,append_col,rep(list(NA),dif[[i]][1]),after=1)
}

但到目前为止似乎没有任何效果......我已经在这里搜索过答案,但很难找到作为新人的具体答案。

【问题讨论】:

  • 那么第一个数据框到底会有50列? 3 已经在那里,加上额外的 4+15+28+3?
  • 第一个 df 应该有 49 列:3 列已经存在加上:列“0”和列“5”之间有 4 列,列“5”和列“20”和 28 之间有 15 列在“20”列之后。
  • 0到底是什么?为什么您会开始将其视为一个专栏?
  • 在海洋学中,我们使用“0”来表示零深度=表面(1 表示 1 米深度,依此类推)
  • "column 1" 是第二列

标签: r function apply


【解决方案1】:

试试:

indxlst <- lapply(dif, function(x) c(1, x[-length(x)]+1, x[length(x)]))
newdflist <- lapply(indxlst, function(x) data.frame(matrix(0, 2, sum(x))))
for(i in 1:length(newdflist)) {
  newdflist[[i]][indxlst[[i]]] <- KDzlambdaEG[[i]]
}

可重复数据测试

df1 <- data.frame(x=1:2, y=c("Jan", "Feb"), z=c("A", "B"))
df3 <- df2 <- df1[,-3]
KDzlambdaEG <- list(df1,df2,df3)

x1 <- c(4,15,28)
x2 <- c(24,67)
x3 <- c(9, 53)
dif <- list(x1,x2,x3)

indxlst <- lapply(dif, function(x) c(1, x[-length(x)]+1, x[length(x)]))
newdflist <- lapply(indxlst, function(x) data.frame(matrix(0, 2, sum(x))))
for(i in 1:length(newdflist)) {
  newdflist[[i]][indxlst[[i]]] <- KDzlambdaEG[[i]]
}
newdflist

【讨论】:

  • 非常感谢您抽出宝贵时间帮助我!有点工作,但不是我期望的那样......添加的新列的数量不是我想要的,而且添加到了错误的位置。我会发布一个输出给你看
  • 好吧,由于选择将零作为一列,只需从dif 列表的第一个元素中减去一个。像这样dif2 &lt;- lapply(dif, function(x) c(x[1]-1, x[-1])),然后再做操作。
猜你喜欢
  • 2014-03-17
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多