rpy2 怎么可能改变我的数据框中的值?

问题描述 投票:0回答:1

我正在尝试使用 rpy2 包在 Python 脚本中利用一些基于 R 的包。为了实现代码,我首先需要将 Pandas 数据帧转换为基于 R 的数据矩阵。然而,代码中的值发生了一些非常奇怪的事情。这是代码的最小可重现示例

import pandas as pd
import numpy as np
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri

pandas2ri.activate()

utils = importr('utils')
msImpute = importr('msImpute')

# Function to generate random column names
def generate_column_names(n, suffixes):
    columns = []
    for _ in range(n):
        name = ''.join(random.choices(string.ascii_uppercase, k=3))  # Random 3-character string
        suffix = random.choice(suffixes)  # Randomly choose between "_Healthy" and "_Sick"
        columns.append(name + suffix)
    return columns
    
# Number of rows and columns
n_rows = 1000
n_cols = 15

# Generate random float values between 0 and 10
data = np.random.uniform(0, 10, size=(n_rows, n_cols))

# Introduce NaN values sporadically
nan_indices = np.random.choice([True, False], size=data.shape, p=[0.1, 0.9])
data[nan_indices] = np.nan

# Generate random column names
column_names = generate_column_names(n_cols, ["_Healthy", "_Sick"])


# Create the DataFrame
df = pd.DataFrame(data, columns=column_names)

df = df.replace(np.nan, "NA")


with localconverter(ro.default_converter + pandas2ri.converter):
     R_df = ro.conversion.py2rpy(df)

r_matrix = r('data.matrix')(R_df)

现在,输入的 Pandas 数据框如下所示: input df

但是,在使用

ro.conversion.py2rpy()
将其转换为基于 R 的数据框,然后使用
r('data.matrix')
将其重新转换为数据矩阵后,我得到一个如下所示的
r_matrix
数据框: output df

怎么会发生这种事?我检查了中间 R_df 并发现它与输入 Pandas 数据帧具有相同的值,因此看起来

r('data.matrix')
行极大地改变了我的内容。

我已经在 R 中运行了类似的命令(在使用 readr 将完全相同的数据帧导入 R 后),并且

data.matrix
根本不影响我的数据帧的内容,所以我对问题是什么感到非常困惑。还有其他人经历过这种情况吗?

python r pandas rpy2
1个回答
0
投票

我怀疑当你在Python中执行

df = df.replace(np.nan, "NA")
时,该列将被存储为
object
类型而不是数字。

pandas
不同,R 没有
object
类型,并且列(或 R 中的向量)需要全部为相同类型。如果向量包含字符串,R 最终会将整个事物视为
character

这是使用

data.matrix()
得到的字符向量的行为。例如:

set.seed(1)
(df <- data.frame(
    x = 1:5,
    y = (as.character(rnorm(5)))
))

#   x                  y
# 1 1 -0.626453810742332
# 2 2  0.183643324222082
# 3 3 -0.835628612410047
# 4 4   1.59528080213779
# 5 5   0.32950777181536

data.matrix(df)

#      x y
# [1,] 1 1
# [2,] 2 3
# [3,] 3 2
# [4,] 4 5
# [5,] 5 4
© www.soinside.com 2019 - 2024. All rights reserved.