如何将这个Python代码转换为R?

时间:2016-10-18 11:48:21

标签: python r dataframe

,我需要帮助将python代码转换为R代码。

我有一个数据框df,其中包含列IndicatorOfDefault,我想生成一个名为indvalues的列。

示例:

row number   IndicatorOfDefault   indvalues

823602                        P           0 

823603                        P           0

823604                  N1,N13,           8

823605                      N1,           1

823606                        P           0

823607         N1,N2,N3,N9,N10,          13

823608                        P           0

我要转换的代码如下:

df['indicators'] = df['IndicatorOfDefault'].str.split(',')

Nvalues = {'' : -1, 'P' : 0, 'N1' : 1, 'N2' : 2, 'N11' : 3, 'N12' : 4, 'N3' : 5, 'N4' : 6, 
           'N6' : 7, 'N10' : 8, 'N13' : 9, 'N5' : 10, 'N7' : 11, 'N8': 12, 'N9' : 13}

df['indvalues'] = df['indicators'].apply(lambda x: max([Nvalues.get(y,y) for y in x ]))

我想在R中执行相同的代码,但我不知道如何在R中编写它。

有人可以帮我吗?

提前致谢

为什么这个问题不在话题?我不明白什么是错的......我是这个网站的新手,所以如果有人能解释为什么这个具体问题不属于这里,我将不胜感激?我已经阅读了帮助中心写的内容,但我仍然不知道出了什么问题。

我设法以不同的方式解决了我的问题。我得到了我想要的结果 - 最重要的指标(它不需要是必要的数字)。

    df$ind <- "P"
for(i in c(1, 2, 11, 12, 3, 4, 6, 10, 13, 5, 7, 8, 9)){
       df <- transform(df, ind = ifelse(grepl(as.character(paste0("N",i,",")),IndicatorOfDefault),as.character(paste0("N",i)),ind))
    }

示例:

row number   IndicatorOfDefault         ind

823602                        P           P 

823603                        P           P

823604                  N1,N13,         N13

823605                      N1,          N1

823606                        P           P

823607         N1,N2,N3,N9,N10,          N9

823608                        P           P

1 个答案:

答案 0 :(得分:0)

由于R没有字典对象,因此最佳翻译将是命名列表。请注意:R不允许零长度名称,因此使用 N0 。从那里你可以使用R vapply()strsplit()对字符串进行字符串拆分并找到相应的最大值。具体而言,vapply()而不是标准lapply()用于将输出类型指定为dataframe列的数字向量。

下面包含两个脚本,用于显示使用已发布数据的精确结果列呈现。

<强>的Python

from io import StringIO
import pandas as pd

data = '''row number;IndicatorOfDefault;indvalues
823602;P;0
823603;P;0
823604;N1,N13,;8
823605;N1,;1
823606;P;0
823607;N1,N2,N3,N9,N10;13
823608;P;0'''

df = pd.read_table(StringIO(data), sep=";")

df['indicators'] = df['IndicatorOfDefault'].str.split(',')

Nvalues = {'' : -1, 'P' : 0, 'N1' : 1, 'N2' : 2, 'N11' : 3, 'N12' : 4, 'N3' : 5, 'N4' : 6, 
           'N6' : 7, 'N10' : 8, 'N13' : 9, 'N5' : 10, 'N7' : 11, 'N8': 12, 'N9' : 13}

df['result'] = df['indicators'].apply(lambda x: max([Nvalues.get(y,y) for y in x ]))

print(df)
#    row number IndicatorOfDefault  indvalues             indicators  result
# 0      823602                  P          0                    [P]       0
# 1      823603                  P          0                    [P]       0
# 2      823604            N1,N13,          8            [N1, N13, ]       9
# 3      823605                N1,          1                 [N1, ]       1
# 4      823606                  P          0                    [P]       0
# 5      823607    N1,N2,N3,N9,N10         13  [N1, N2, N3, N9, N10]      13
# 6      823608                  P          0                    [P]       0

<强> - [R

data = 'row number;IndicatorOfDefault;indvalues
823602;P;0
823603;P;0
823604;N1,N13,;8
823605;N1,;1
823606;P;0
823607;N1,N2,N3,N9,N10;13
823608;P;0'

df = read.table(text=data, sep=";", header=TRUE, stringsAsFactors = FALSE)

Nvalues = list(N0=-1, P=0, N1=1, N2=2, N11=3, N12=4,
               N3=5, N4=6, N6=7, N10=8, N13=9, N5=10,
               N7=11, N8=12, N9=13)

df$indicators <- lapply(df$IndicatorOfDefault, function(i) {
     as.character(strsplit(i, ",")[[1]])
})

df$result <- vapply(df$indicators, function(i) {  
     max(as.numeric(Nvalues[i]))  
}, numeric(1))

df

#   row.number IndicatorOfDefault indvalues          indicators result
# 1     823602                  P         0                   P      0
# 2     823603                  P         0                   P      0
# 3     823604            N1,N13,         8             N1, N13      9
# 4     823605                N1,         1                  N1      1
# 5     823606                  P         0                   P      0
# 6     823607    N1,N2,N3,N9,N10        13 N1, N2, N3, N9, N10     13
# 7     823608                  P         0                   P      0