为多个数据帧和未列表的列表计算新属性

时间:2016-10-08 04:32:43

标签: r list dataframe lapply

我在R请求您帮助解决问题。 我的数据框如下所示

df1

a,b,c,d

1,2,3,4

1,2,3,4

1,2,3,4

df2

a,b,c,d

1,2,3,4

1,2,3,4

1,2,3,4

1,2,3,4

我需要对每个数据帧执行操作,如下所示

 df1$value <- 0.12*df1$a+0.24*df1$b+0.56*df1$c

从另一个Stack Overflow应答中读取,建议放入所有数据帧的列表。我试图使用以下声明来这样做。它工作

df_list <- list(ls(pattern='df*'))

现在我无法使用lapply

使用以下代码计算新属性
res <- lapply(dflist, function(x) {
          0.12*grep(x[[a]])+0.24*grep(x[[b]])+0.56*grep(x[[c]]))
          })

执行上述操作后,我想在没有列表的情况下改造我的数据帧。

2 个答案:

答案 0 :(得分:2)

R中,最好将data.frame保存在list中。如果我们确实需要更新全局环境中的data.frames对象,请在{d}向'{1}}'df_list'后使用list2env

transform

我们使用df_list <- mget(ls(pattern='df\\d+')) res <- lapply(df_list, transform, value = 0.12*a + 0.24*b + 0.56*c) list2env(res, envir = .GlobalEnv) df1 # a b c d value #1 1 2 3 4 2.28 #2 1 2 3 4 2.28 #3 1 2 3 4 2.28 df2 # a b c d value #1 1 2 3 4 2.28 #2 1 2 3 4 2.28 #3 1 2 3 4 2.28 #4 1 2 3 4 2.28 ls(pattern='df\\d+'))中获取字符串(list)的值,然后循环遍历mget list s data.frame 1}}),lapply(df_list, ...在每个transform中创建一个新列“值”,最后使用data.frame更新全局环境中的对象。

数据

list2env

答案 1 :(得分:2)

这是一个矩阵乘法的解决方案:

#! usr/bin/python
# -*- coding: utf-8 -*-
import csv, sys, os
from lxml import etree


csvFile = 'myData.csv' # création de la variable pour le fichier csv
reader= csv.reader(open(csvFile), delimiter=';', quoting=csv.QUOTE_NONE) # création d'une variable reader à qui on renvoie le tableau csv

print "<data>"
for record in reader:
    if reader.line_num == 1:
        header = record
    else:
        innerXml = ""
        dontShow = False
        type = ""
        for i, field in enumerate(record):
            innerXml += "<%s>" % header[i].lower() + field + "</%s>" % header[i].lower()
            if i == 1 and field == "0":
                type = "Next"
            elif type == "" and i == 3 and field == "0":
                type = "Next"
            elif type == "" and i == 3 and field != "0":
                type = "film"

            if i == 1 and field == "X":
                dontShow = True

        if dontShow == False:
            xml = "<%s>" % type
            xml += innerXml
            xml += "</%s>" % type
            print xml
print "</data>"

df1 <- read.table(header=TRUE, sep=",", text=
"a,b,c,d
1,2,3,4
1,2,3,4
1,2,3,4")

df2 <- read.table(header=TRUE, sep=",", text=
"a,b,c,d
1,2,3,4
1,2,3,4
1,2,3,4
1,2,3,4")

df1$value <- as.matrix(df1) %*% c(0.12, 0.24, 0.56, 0)
df1
df2$value <- as.matrix(df2) %*% c(0.12, 0.24, 0.56, 0)
df2

要处理数据帧列表,您可以这样做:

df1$value <- as.matrix(df1[1:3]) %*% c( 0.12, 0.24, 0.56)
df2$value <- as.matrix(df2[1:3]) %*% c( 0.12, 0.24, 0.56)