2015-07-16 4 views
0

Я новичок в использовании приложений и функций вместе, и я застрял и разочарован. У меня есть два разных списка фреймов данных, в которые мне нужно добавить определенное количество столбцов к первому, когда выполняется условие, связанное со вторым. Ниже это структура первого списка, который имеет рамку один данных для любой станции и каждый DF имеет 2 или более столбцов с каждым давлением:применить функцию столбцов к списку r

> 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 

I've пытался тонн вещей, даже это, используя функцию 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) 
} 

, но ничего не работает до сих пор ... Я искал ответы здесь, но трудно найти конкретных, являющихся новичком.

+0

Таким образом, первый кадр данных будет иметь 50 столбцов, в конце концов? 3 уже есть плюс дополнительные «4 + 15 + 28 + 3'? –

+0

Первый df должен иметь 49 столбцов: 3 столбца уже присутствуют плюс: 4 столбца между столбцами «0» и столбцом «5», 15 столбцов между столбцами «5» и столбцами «20» и 28 после столбца «20». –

+0

Что такое столбец '0'? И почему вы начнете считать его колонкой? –

ответ

0

Try:

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 
+0

Большое вам спасибо за то, что нашли время, чтобы помочь мне! Работа Kinda, но не так, как я ожидал ... Число добавленных новых столбцов было не так, как мне хотелось, а также было добавлено в неправильную позицию. я опубликую результат, чтобы показать вам –

+0

Ну, из-за выбора подсчета нуля в качестве столбца просто вычтите из первого элемента списка 'dif'. Что-то вроде этого 'dif2 <- lapply (dif, function (x) c (x [1] -1, x [-1]))', затем повторите операцию. –

Смежные вопросы