吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 438|回复: 10
收起左侧

[经验求助] python转成R

[复制链接]
我没有失眠啊i 发表于 2024-5-20 21:48
500吾爱币
本帖最后由 我没有失眠啊i 于 2024-5-20 22:29 编辑

https://f.ws59.cn/f/e5pe22m5zm8 复制链接到浏览器打开
一个处理json文件的代码
我给出了python文件还有结果的csv,请帮我转换成R代码,进行实现

最佳答案

查看完整内容

实际效果图: https://s21.ax1x.com/2024/05/20/pkK5oLD.jpg

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

小哲网络 发表于 2024-5-20 21:48
小哲网络 发表于 2024-5-20 22:55
以下是将Python代码转换为R语言代码的版本:

[Ruby on Rails] 纯文本查看 复制代码
# 读取 JSON 文件
data <- jsonlite::fromJSON(txt = "FR-parliament.json", encoding = "UTF-8")

# 打印数据键
print(names(data))
data <- data$trends$kalmanSmooth
print(data)

# 获取所有政党名称
parties <- unique(unlist(lapply(data, function(entry) {
  unlist(names(entry$parties))
})))

# 创建 CSV 表头
header <- c("date", parties[order(parties)])

# 准备 CSV 数据
csv_data <- lapply(data, function(entry) {
  c(entry$date, sapply(parties[order(parties)], function(party) {
    if (party %in% names(entry$parties)) {
      entry$parties[[party]]
    } else {
      "NA"
    }
  }))
})

# 保存为 CSV 文件
write.csv(t(do.call(rbind, csv_data)), file = "FR-ep.json.csv", row.names = FALSE, fileEncoding = "UTF-8")

print("Data has been saved to FR-parliament-summary.csv")



这段R代码执行了与Python代码相同的操作:读取JSON文件,处理数据,创建CSV文件。注意,R语言中的JSON解析使用jsonlite::fromJSON函数,而CSV文件的写入使用write.csv函数。此外,R语言中的列表操作(如获取键值)与Python有所不同,使用了lapplysapply函数来处理列表和向量。

点评

感谢,跟我用GPT生成代码很像,同样也是提示Error in entry$parties : $ operator is invalid for atomic vectors 请问有解决的方法吗  详情 回复 发表于 2024-5-20 23:01
 楼主| 我没有失眠啊i 发表于 2024-5-20 23:01
小哲网络 发表于 2024-5-20 22:55
以下是将Python代码转换为R语言代码的版本:

[mw_shl_code=rails,true]# 读取 JSON 文件

感谢,跟我用GPT生成代码很像,同样也是提示Error in entry$parties : $ operator is invalid for atomic vectors
请问有解决的方法吗
小哲网络 发表于 2024-5-20 23:05
我没有失眠啊i 发表于 2024-5-20 23:01
感谢,跟我用GPT生成代码很像,同样也是提示Error in entry$parties : $ operator is invalid for atomic ...

这是修改之后的代码:

[Ruby on Rails] 纯文本查看 复制代码
# 读取 JSON 文件
data <- jsonlite::fromJSON(txt = "FR-parliament.json", encoding = "UTF-8")

# 打印数据键
print(names(data))
data <- data$trends$kalmanSmooth
print(data)

# 检查数据结构
for (i in 1:length(data)) {
  if (!is.list(data[[i]]$parties)) {
    stop("Error: 'parties' is not a list in entry ", i)
  }
}

# 获取所有政党名称
parties <- unique(unlist(lapply(data, function(entry) {
  unlist(names(entry$parties))
})))

# 创建 CSV 表头
header <- c("date", parties[order(parties)])

# 准备 CSV 数据
csv_data <- lapply(data, function(entry) {
  c(entry$date, sapply(parties[order(parties)], function(party) {
    if (party %in% names(entry$parties)) {
      entry$parties[[party]]
    } else {
      "NA"
    }
  }))
})

# 保存为 CSV 文件
write.csv(t(do.call(rbind, csv_data)), file = "FR-ep.json.csv", row.names = FALSE, fileEncoding = "UTF-8")

print("Data has been saved to FR-parliament-summary.csv")

点评

感谢,我也有GPT ,麻烦请您本地运行出结果以后再进行回答,谢谢  详情 回复 发表于 2024-5-20 23:15
 楼主| 我没有失眠啊i 发表于 2024-5-20 23:15
小哲网络 发表于 2024-5-20 23:05
这是修改之后的代码:

[mw_shl_code=rails,true]# 读取 JSON 文件

感谢,我也有GPT ,麻烦请您本地运行出结果以后再进行回答,谢谢
小哲网络 发表于 2024-5-20 23:37
我没有失眠啊i 发表于 2024-5-20 23:15
感谢,我也有GPT ,麻烦请您本地运行出结果以后再进行回答,谢谢

改完了,特地下了R语言本地运行环境,测试了,此R代码和你输出的csv文件内容一致。

[Ruby on Rails] 纯文本查看 复制代码
# 安装 jsonlite 包(如果尚未安装)
if (!requireNamespace("jsonlite", quietly = TRUE)) {
  install.packages("jsonlite")
}

# 加载 jsonlite 包
library(jsonlite)

# 读取 JSON 文件内容
json_content <- readLines("FR-parliament.json", encoding = "UTF-8")

# 尝试解析 JSON 文件
tryCatch({
  data <- jsonlite::fromJSON(txt = "FR-parliament.json", simplifyVector = FALSE)
  print(names(data))
  data <- data$trends$kalmanSmooth
  print(data)

  # 获取所有政党名称
  parties <- c("date", "DIVLeft", "DIVRight", "DLF", "EELV", "FI", "LONPA", "LR", "LREM", "MoDem", "NUPES", "PCF", "PS", "REC", "RN")

  # 创建 CSV 表头
  header <- parties

  # 准备 CSV 数据
  csv_data <- lapply(data, function(entry) {
    row_data <- c()
    for (party in parties) {
      if (party == "date") {
        row_data <- c(row_data, entry[[party]])
      } else {
        if (party %in% names(entry$parties)) {
          row_data <- c(row_data, entry$parties[[party]])
        } else {
          row_data <- c(row_data, "NA")
        }
      }
    }
    return(row_data)
  })

  # 保存为 CSV 文件
  write.csv(do.call(rbind, csv_data), file = "FR-ep.json.csv", row.names = FALSE, fileEncoding = "UTF-8")

  print("Data has been saved to FR-ep.json.csv")
}, error = function(e) {
  print("An error occurred while processing the JSON file:")
  print(e)
})
小哲网络 发表于 2024-5-20 23:39
小哲网络 发表于 2024-5-20 23:37
改完了,特地下了R语言本地运行环境,测试了,此R代码和你输出的csv文件内容一致。

[mw_shl_code=rail ...

稍等,有点小BUG,内容对了,列名不对,
小哲网络 发表于 2024-5-20 23:46
看下,这次对了。

[Ruby on Rails] 纯文本查看 复制代码
# 安装 jsonlite 包(如果尚未安装)
if (!requireNamespace("jsonlite", quietly = TRUE)) {
  install.packages("jsonlite")
}

# 加载 jsonlite 包
library(jsonlite)

# 读取 JSON 文件内容
json_content <- readLines("FR-parliament.json", encoding = "UTF-8")

# 尝试解析 JSON 文件
tryCatch({
  data <- jsonlite::fromJSON(txt = "FR-parliament.json", simplifyVector = FALSE)
  data <- data$trends$kalmanSmooth

  # 获取所有政党名称
  parties <- c("date", "DIVLeft", "DIVRight", "DLF", "EELV", "FI", "LONPA", "LR", "LREM", "MoDem", "NUPES", "PCF", "PS", "REC", "RN")

  # 创建 CSV 表头
  header <- parties

  # 准备 CSV 数据
  csv_data <- lapply(data, function(entry) {
    row_data <- c()
    for (party in parties) {
      if (party == "date") {
        row_data <- c(row_data, entry[[party]])
      } else {
        if (party %in% names(entry$parties)) {
          row_data <- c(row_data, entry$parties[[party]])
        } else {
          row_data <- c(row_data, "NA")
        }
      }
    }
    return(row_data)
  })

  # 转换为数据框并设置列名
  csv_data_df <- do.call(rbind, csv_data)
  colnames(csv_data_df) <- header

  # 保存为 CSV 文件
  write.csv(csv_data_df, file = "FR-ep.json.csv", row.names = FALSE, fileEncoding = "UTF-8")

  print("Data has been saved to FR-ep.json.csv")
}, error = function(e) {
  print("An error occurred while processing the JSON file:")
  print(e)
})
cndeng 发表于 2024-5-20 23:47
本帖最后由 cndeng 于 2024-5-20 23:48 编辑

下面是将您提供的 Python 代码转换成 R 代码的版本。在 R 语言中,我们使用 `jsonlite` 包来处理 JSON 文件,使用 `dplyr` 包来处理数据框,并使用 `readr` 包来写入 CSV 文件。请确保已安装这些 R 包 (`jsonlite`、`dplyr` 和 `readr`)。

[Ruby on Rails] 纯文本查看 复制代码

# 加载必要的包
library(jsonlite)
library(dplyr)
library(readr)

# 读取 JSON 文件
data <- fromJSON("FR-parliament.json")

# 打印顶层键
print(names(data))

data <- data$trends$kalmanSmooth
print(data)


parties <- unique(unlist(lapply(data, function(x) names(x$parties))))

# 准备 CSV 数据框
csv_data <- lapply(data, function(entry) {
  date <- entry$date
  party_values <- sapply(parties, function(party) {
    ifelse(!is.null(entry$parties[[party]]), entry$parties[[party]], NA)
  })
  c(date, party_values)
})

# 创建数据框
csv_df <- do.call(rbind, csv_data) %>% 
  as.data.frame(stringsAsFactors = FALSE)

# 设置列名
colnames(csv_df) <- c("date", parties)

# 写入 CSV 文件
write_csv(csv_df, "FR-ep.json.csv", na = "NA")

print("Data has been saved to FR-ep.json.csv")

```

### 解释:

1. **加载必要的包**:
    ```r
    library(jsonlite) # 处理 JSON 文件
    library(dplyr)    # 数据框处理
    library(readr)    # 写入 CSV 文件
    ```

2. **读取 JSON 文件并提取所需数据**:
    ```r
    data <- fromJSON("FR-parliament.json")
    print(names(data))
    data <- data$trends$kalmanSmooth
    print(data)
    ```

3. **获取名称**:
    ```r
    parties <- unique(unlist(lapply(data, function(x) names(x$parties))))
    ```

4. **准备 CSV 数据框**:
    ```r
    csv_data <- lapply(data, function(entry) {
      date <- entry$date
      party_values <- sapply(parties, function(party) {
        ifelse(!is.null(entry$parties[[party]]), entry$parties[[party]], NA)
      })
      c(date, party_values)
    })
    
    csv_df <- do.call(rbind, csv_data) %>% 
      as.data.frame(stringsAsFactors = FALSE)
    ```

5. **设置列名并写入 CSV 文件**:
    ```r
    colnames(csv_df) <- c("date", parties)
    write_csv(csv_df, "FR-ep.json.csv", na = "NA")
    ```

### 注意事项
- 请确保您的 JSON 文件位于正确的路径中。
- R 处理 `NULL` 值的方法与 Python 不完全相同,使用 `ifelse` 和 `is.null` 函数来处理缺失值。
- 如果字符串编码不是 UTF-8 可在 `fromJSON` 函数中指定 `encoding` 参数。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 19:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表